const gulp = require('gulp');
const exec = require('child_process').execSync;
const del = require('del');
const fs = require('fs-extra');
const path = require('path');
const zip = require('zip-dir');

/**
 * Install and copy the required files from the "composer_modules" directory.
 *
 * Composer needs to be installed and configured in order for this command to
 * work properly.
 */
gulp.task('composer', function() {
    del.sync([
        './src/vendor/**/*',
        '!./src/vendor/index.html'
    ]);

    return gulp.src([
        'vendor/**/*',
        '!vendor/**/demo{,/**}',
        '!vendor/**/{demo,docs,examples,test,tests,extras,language}{,/**}',
        '!vendor/**/{composer.json,composer.lock,.gitignore}',
        '!vendor/**/{*.yml,*.md,*phpunit*,*.mdown}',
        '!vendor/bin{,/**}',
        '!vendor/codeigniter{,/**}',
        '!vendor/doctrine{,/**}',
        '!vendor/myclabs{,/**}',
        '!vendor/phpdocumentor{,/**}',
        '!vendor/phpspec{,/**}',
        '!vendor/phpunit{,/**}',
        '!vendor/sebastian{,/**}',
        '!vendor/symfony{,/**}',
        '!vendor/webmozart{,/**}'
    ])
        .pipe(gulp.dest('./src/vendor/'));
});

/**
 * Build the project and create an easyappointments.zip file ready for distribution.
 */
gulp.task('build', function(done) {
    del.sync([
        '.tmp-package',
        'easyappointments.zip'
    ]);

    fs.copySync('src', '.tmp-package');
    fs.removeSync('.tmp-package/config.php');
    fs.copySync('CHANGELOG.md', '.tmp-package/CHANGELOG.md');
    fs.copySync('README.md', '.tmp-package/README.md');
    fs.copySync('LICENSE', '.tmp-package/LICENSE');

    del.sync([
        '.tmp-package/storage/uploads/*',
        '!.tmp-package/storage/uploads/index.html'
    ]);

    del.sync([
        '.tmp-package/storage/logs/*',
        '!.tmp-package/storage/logs/index.html'
    ]);

    del.sync([
        '.tmp-package/storage/sessions/*',
        '!.tmp-package/storage/sessions/.htaccess',
        '!.tmp-package/storage/sessions/index.html'
    ]);

    del.sync([
        '.tmp-package/storage/cache/*',
        '!.tmp-package/storage/cache/.htaccess',
        '!.tmp-package/storage/cache/index.html'
    ]);

    zip('.tmp-package', { saveTo: 'easyappointments.zip' }, function (err, buffer) {
        if (err)
            console.log('Zip Error', err);

        done();
    });
});

/**
 * Generate code documentation.
 */
gulp.task('doc', function(done) {
    fs.removeSync('doc/apigen');
    fs.mkdirSync('doc/apigen');
    fs.removeSync('doc/jsdoc');
    fs.mkdirSync('doc/jsdoc');
    fs.removeSync('doc/plato');
    fs.mkdirSync('doc/plato');

    const commands = [
        'php rsc/apigen.phar generate ' +
            '-s "src/application/controllers,src/application/models,src/application/libraries" ' +
            '-d "doc/apigen" --exclude "*external*" --tree --todo --template-theme "bootstrap"',

        path.join('.', 'node_modules', '.bin', 'jsdoc') + ' "src/assets/js" -d "doc/jsdoc"',

        path.join('.', 'node_modules', '.bin', 'plato') + ' -r -d "doc/plato" "src/assets/js"'
    ];

    commands.forEach(function(command) {
        exec(command, function (err, stdout, stderr) {
            console.log(stdout);
            console.log(stderr);
        });
    });

    done();
});
