const fs = require('fs');

const defaultOptions = {
    type: 'zip',
    glob: '**/*',
    dot: true,
    ignore: ['node_modules/**']
};

/**
 * Compress
 *
 * - Create a zip file from a folder
 *
 * @param {String} folderToZip - full path to the folder to be zipped
 * @param {String} destination - full path to the resulting zip file
 * @param {Object} [options]
 * @param {String} options.type - zip by default see archiver for other options
 * @param {String} options.glob - the files to include, defaults to all files and folders
 * @param {Boolean} options.dot - include all dotfiles and dotfolders
 * @param {Array} options.ignore - any paths that should be ignored, sets node_modules by default
 *
 */
module.exports = (folderToZip, destination, options = {}) => {
    const opts = Object.assign({}, defaultOptions, options);

    const archiver = require('archiver');
    const output = fs.createWriteStream(destination);
    const archive = archiver.create(opts.type);

    return new Promise((resolve, reject) => {
        // If folder to zip is a symlink, we want to get the target
        // of the link and zip that instead of zipping the symlink
        if (fs.lstatSync(folderToZip).isSymbolicLink()) {
            folderToZip = fs.realpathSync(folderToZip);
        }

        output.on('close', function () {
            resolve({path: destination, size: archive.pointer()});
        });

        archive.on('error', function (err) {
            reject(err);
        });
        archive.glob(opts.glob, {
            cwd: folderToZip,
            dot: opts.dot,
            ignore: opts.ignore
        });
        archive.pipe(output);
        archive.finalize();
    });
};
