const gulp            = require('gulp'),
      babelify        = require('babelify'),
      browserify      = require('browserify'),
      buffer          = require('vinyl-buffer'),
      del             = require('del'),
      minify          = require('gulp-minify'),
      size            = require('gulp-size'),
      source          = require('vinyl-source-stream'),
      config = {
          name: 'AlphaWallet',
          fileTypes: {
            all: '**/*',
            js: '**/*.js',
            main: 'index.js'
          },
          source: {
            baseDir: 'src'
          },
          staging: {
            baseDir: 'staging'
          },
          distribution: {
            baseDir: 'dist',
            javascript: 'js'
          }
        };

gulp.task('clean:stage', function () {
  let stagingDir = `${config.staging.baseDir}/${config.fileTypes.all}`;
  return del(stagingDir);
});

gulp.task('clean:dist', function () {
  let distributionDir = `${config.distribution.baseDir}/${config.fileTypes.all}`;
  return del(distributionDir);
});

gulp.task('clean', gulp.series('clean:dist', 'clean:stage'))

gulp.task('javascript', function () {
  let sourceDir  = `${config.source.baseDir}/${config.fileTypes.js}`,
      stagingDir = `${config.staging.baseDir}`;
  return gulp.src(sourceDir)
  .pipe(gulp.dest(stagingDir));
});

gulp.task('bundle:javascript', gulp.series('javascript', function () {
  let mainFile = `${config.staging.baseDir}/${config.fileTypes.main}`,
      distributionDir = `${config.distribution.baseDir}`;
  return browserify(mainFile)
  .transform(babelify, { presets: ['env'] })
  .bundle()
  .pipe(source(config.name + '.js'))
  .pipe(buffer())
  .pipe(minify({
    mangle: {
      reserved: [ 'AlphaWalletWeb3Provider' ]
    }
  }))
  .pipe(size())
  .pipe(gulp.dest(distributionDir));
}));

gulp.task('build', gulp.series('clean:dist', 'clean:stage', `bundle:javascript`))