function dsExportData(data,varargin)
%EXPORTDATA - export DynaSim data structure in various formats.
%
% Usage:
%   dsExportData(data,varargin)
%
% Inputs:
%   - data: DynaSim data structure (see dsCheckData) or any result data
%   - options:
%     'filename'    : name of output data file (default: 'data.mat')
%     'format'      : mat. todo: csv, HDF. (default: 'mat')
%     'verbose_flag': whether to print log info (default: 0)
%
% See also: dsImport, dsCheckData, dsSimulate
%
% Author: Jason Sherfey, PhD <jssherfey@gmail.com>
% Copyright (C) 2016 Jason Sherfey, Boston University, USA

options=dsCheckOptions(varargin,{...
  'filename','data.mat',[],... % name of output data file
  'format','mat',[],... % mat. todo: csv, HDF
  'matCompatibility_flag',1,{0,1},... % whether to save mat files in compatible mode, or to prioritize > 2GB VARs
  'verbose_flag',0,{0,1},... % whether to print log info
  'result_flag',0,{0,1},... % whether exporting result instead of data
  },false);

% print
if ~options.result_flag
  dsVprintf(options, '  Saving data %s\n', options.filename);
else
  dsVprintf(options, '    Saving result: %s\n', options.filename);
end

% determine data type
if ~options.result_flag
  varName = 'data';
else
  varName = 'result';
  result = data;
  clear data
end


switch lower(options.format)
  case 'mat'
    if exist('data', 'var') && numel(data)==1 && ~options.result_flag % only for single data, not results
      % split DynaSim data structure into separate variables saved to a
      % mat-file for subsequent loading with matfile()
      vars=fieldnames(data);
      
      if options.matCompatibility_flag
        try
          save(options.filename, '-struct',varName, '-v7');
        catch
          fprintf('Data is not ''-v7'' compatible. Setting ''matCompatibility_flag'' to 0.\n')
          
          options.matCompatibility_flag = 0;
          
          if strcmp(reportUI,'matlab')
            save(options.filename, '-struct',varName, '-v7.3');
          else
            save(options.filename, '-struct',varName, '-hdf5'); % hdf5 format in Octave
          end
        end
      else
        if strcmp(reportUI,'matlab')
          save(options.filename, '-struct',varName, '-v7.3');
        else
          save(options.filename, '-struct',varName, '-hdf5'); % hdf5 format in Octave
        end
      end % if options.matCompatibility_flag
    else % numel(data)~=1
      if options.matCompatibility_flag
        try
          save(options.filename,varName,'-v7');
        catch
          fprintf('Data is not ''-v7'' compatible. Setting ''matCompatibility_flag'' to 0.\n')
          options.matCompatibility_flag = 0;
          if strcmp(reportUI,'matlab')
            save(options.filename,varName,'-v7.3');
          else
            save(options.filename,varName,'-hdf5'); % hdf5 format in Octave
          end
        end
      else
        if strcmp(reportUI,'matlab')
          save(options.filename,varName,'-v7.3');
        else
          save(options.filename,varName,'-hdf5'); % hdf5 format in Octave
        end
      end % if options.matCompatibility_flag
    end % if numel(data)==1
  case 'csv'
    % write csv file
    % ExportCSV(data,options.filename);
  case 'hdf'
    % ExportHDF(data,options.filename);
  otherwise
    % not recognized
end

end % main fn