function spm_copy(source, dest, varargin)
% Copy file(s)
% FORMAT spm_copy(source, dest [,opts])
%__________________________________________________________________________
% Copyright (C) 2017 Wellcome Trust Centre for Neuroimaging

% Guillaume Flandin
% $Id: spm_copy.m 7354 2018-06-22 10:44:22Z guillaume $


%-Source and destination
%--------------------------------------------------------------------------
source = cellstr(source);
if nargin < 2
    dest = pwd;
end
dest = cellstr(dest);
if numel(source) == 1
    source = repmat(source,numel(dest),1);
elseif numel(dest) == 1
    dest = repmat(dest,numel(source),1);
elseif numel(source) ~= numel(dest)
    error('Number of elements in source and dest must be one or equal.');
end

%-Options (struct array or key/value pairs)
%--------------------------------------------------------------------------
opts = struct('gzip', false, 'gunzip', false, 'nifti', false, 'mode', {{}});
if nargin > 2
    if isstruct(varargin{1})
        opt = varargin{1};
    else
        opt = struct;
        for i=1:2:numel(varargin)
            opt.(varargin{i}) = varargin{i+1};
        end
    end
else
    opt = struct([]);
end
fn = fieldnames(opt);
for i=1:numel(fn)
    if ~isfield(opts,lower(fn{i}))
        warning('Unknown option "%s".',fn{i});
    end
    opts.(lower(fn{i})) = opt.(fn{i});
end

%-Actual copy
%--------------------------------------------------------------------------
for i=1:numel(source)
    protocol = source{i}(1:find(source{i}==':',1)-1);
    if ismember(protocol,{'file','http','https','ftp'})
        urlwrite(source{i}, dest{i}); % dest{i} has to be a filename...
    else
        sts = copyfile(source{i}, dest{i}, opts.mode{:});
    end
    if opts.nifti
        if strcmp(spm_file(source{i},'ext'),'img')
            sts = copyfile(spm_file(source{i},'ext','hdr'), dest{i}, opts.mode{:});
            sts = copyfile(spm_file(source{i},'ext','mat'), dest{i}, opts.mode{:});
            sts = copyfile(spm_file(source{i},'ext','json'), dest{i}, opts.mode{:});
        elseif strcmp(spm_file(source{i},'ext'),'hdr')
            sts = copyfile(spm_file(source{i},'ext','img'), dest{i}, opts.mode{:});
            sts = copyfile(spm_file(source{i},'ext','mat'), dest{i}, opts.mode{:});
            sts = copyfile(spm_file(source{i},'ext','json'), dest{i}, opts.mode{:});
        elseif strcmp(spm_file(source{i},'ext'),'nii')
            sts = copyfile(spm_file(source{i},'ext','mat'), dest{i}, opts.mode{:});
            sts = copyfile(spm_file(source{i},'ext','json'), dest{i}, opts.mode{:});
        end
    end
    if opts.gzip && ~strcmp(spm_file(source{i},'ext'),'gz')
        gzip(spm_file(source{i},'path',dest{i}));
        spm_unlink(spm_file(source{i},'path',dest{i}));
    end
    if opts.gunzip && strcmp(spm_file(source{i},'ext'),'gz')
        gunzip(spm_file(source{i},'path',dest{i}));
        spm_unlink(spm_file(source{i},'path',dest{i}));
    end
end
