/*jshint node: true, strict: false */

var fs = require('fs');
var gulp = require('gulp');
var rename = require('gulp-rename');
var replace = require('gulp-replace');

// ----- hint ----- //

var jshint = require('gulp-jshint');

gulp.task( 'hint-js', function() {
  return gulp.src('js/**/*.js')
    .pipe( jshint() )
    .pipe( jshint.reporter('default') );
});

gulp.task( 'hint-test', function() {
  return gulp.src('test/unit/*.js')
    .pipe( jshint() )
    .pipe( jshint.reporter('default') );
});

gulp.task( 'hint-task', function() {
  return gulp.src('gulpfile.js')
    .pipe( jshint() )
    .pipe( jshint.reporter('default') );
});

var jsonlint = require('gulp-json-lint');

gulp.task( 'jsonlint', function() {
  return gulp.src( '*.json' )
    .pipe( jsonlint() )
    .pipe( jsonlint.report('verbose') );
});

gulp.task( 'hint',
  gulp.parallel('hint-js', 'hint-test', 'hint-task', 'jsonlint' ) );

// -------------------------- RequireJS makes pkgd -------------------------- //

var gutil = require('gulp-util');
var chalk = require('chalk');
var rjsOptimize = require('gulp-requirejs-optimize');

// regex for banner comment
var reBannerComment = new RegExp('^\\s*(?:\\/\\*[\\s\\S]*?\\*\\/)\\s*');

function getBanner() {
  var src = fs.readFileSync( 'js/index.js', 'utf8' );
  var matches = src.match( reBannerComment );
  var banner = matches[0].replace( 'Flickity', 'Flickity PACKAGED' );
  return banner;
}

function addBanner( str ) {
  return replace( /^/, str );
}

gulp.task( 'requirejs', function() {
  var banner = getBanner();
  // HACK src is not needed
  // should refactor rjsOptimize to produce src
  return gulp.src('js/index.js')
    .pipe( rjsOptimize({
      baseUrl: 'bower_components',
      optimize: 'none',
      include: [
        'jquery-bridget/jquery-bridget',
        'flickity/js/index',
        'flickity-as-nav-for/as-nav-for',
        'flickity-imagesloaded/flickity-imagesloaded'
      ],
      paths: {
        flickity: '../',
        jquery: 'empty:'
      }
    }) )
    // remove named module
    .pipe( replace( "'flickity-imagesloaded/flickity-imagesloaded',", '' ) )
    // add banner
    .pipe( addBanner( banner ) )
    .pipe( rename('flickity.pkgd.js') )
    .pipe( gulp.dest('dist') );
});


// ----- uglify ----- //

var uglify = require('gulp-uglify');

gulp.task( 'uglify', function() {
  var banner = getBanner();
  return gulp.src('dist/flickity.pkgd.js')
    .pipe( uglify() )
    // add banner
    .pipe( addBanner( banner ) )
    .pipe( rename('flickity.pkgd.min.js') )
    .pipe( gulp.dest('dist') );
});

// ----- css ----- //

var cleanCSS = require('gulp-clean-css');

gulp.task( 'css', function() {
  return gulp.src('css/flickity.css')
    // copy to dist
    .pipe( gulp.dest('dist') )
    // minify
    .pipe( cleanCSS({ advanced: false }) )
    .pipe( rename('flickity.min.css') )
    .pipe( replace( '*/', '*/\n' ) )
    .pipe( gulp.dest('dist') );
});

// ----- version ----- //

// set version in source files

var minimist = require('minimist');
var merge2 = require('merge2');

// use gulp version -t 1.2.3
gulp.task( 'version', function() {
  var args = minimist( process.argv.slice(3) );
  var version = args.t;
  if ( !version || !/\d\.\d\.\d/.test( version ) ) {
    gutil.log( 'invalid version: ' + chalk.red( version ) );
    return;
  }
  gutil.log( 'ticking version to ' + chalk.green( version ) );

  function sourceReplace() {
    return replace( /Flickity v\d\.\d+\.\d+/, 'Flickity v' + version );
  }

  var indexJs = gulp.src('js/index.js')
    .pipe( sourceReplace() )
    .pipe( gulp.dest('js') );

  var css = gulp.src('css/flickity.css')
    .pipe( sourceReplace() )
    .pipe( gulp.dest('css') );

  var json = gulp.src('package.json')
    .pipe( replace( /"version": "\d\.\d+\.\d+"/, '"version": "' + version + '"' ) )
    .pipe( gulp.dest('.') );

  // create a merged stream for array of streams
  return merge2([ indexJs, css, json ]);
});

// ----- default ----- //

gulp.task( 'default', gulp.parallel(
  'hint',
  'css',
  gulp.series( 'requirejs', 'uglify' )
));
