var gulp = require('gulp'),
    // Pulls in any Gulp-related metadata
    pkg = require('./package.json'),
    // Use $ to invoke Gulp plugins
    $ = require('gulp-load-plugins')(),
    // All non-Gulp modules here
    del = require('del');

// Define the source and distribution directories
var srcDir = './src';
var distDir = './static';

// Define asset sources
var SRC = {
  js: srcDir + '/js/**/*.js',
  css: srcDir + '/css/**/*.css',
  sass: srcDir + '/sass/**/*.scss',
  fonts: srcDir + '/fonts/**/*',
  images: srcDir + '/img/**/*',
  javadoc: './api/**/*'
}

// Define asset distribution destination
var DIST = {
  css: distDir + '/css',
  js: distDir + '/js',
  fonts: distDir + '/fonts',
  images: distDir + '/img',
  javadoc: './public',
  all: distDir
}

// JavaScript assets
gulp.task('js', function() {
  return gulp.src(SRC.js)
    .pipe($.uglify())
    .pipe($.concat('app.min.js'))
    .pipe(gulp.dest(DIST.js));
});

gulp.task('js:watch', function() {
  gulp.watch(SRC.js, ['js']);
});

// CSS assets
gulp.task('css', function() {
  return gulp.src(SRC.css)
    .pipe(gulp.dest(DIST.css));
});

gulp.task('css:watch', function() {
  return gulp.watch(SRC.css, ['css']);
});

// Sass assets
gulp.task('sass', function() {
  gulp.src(SRC.sass)
    .pipe($.sass().on('error', function(err) { console.log(err); }))
    .pipe($.cleanCss())
    .pipe($.concat('style.min.css'))
    .pipe(gulp.dest(DIST.css));
});

gulp.task('sass:watch', function() {
  gulp.watch(SRC.sass, ['sass']);
});

// Javadoc
gulp.task('javadoc', function() {
  gulp.src(SRC.javadoc)
    .pipe(gulp.dest(DIST.javadoc));
});

// Fonts
gulp.task('fonts', function() {
  gulp.src(SRC.fonts)
    .pipe(gulp.dest(DIST.fonts));
});

// Images
gulp.task('images', function() {
  gulp.src(SRC.images)
    .pipe(gulp.dest(DIST.images));
});

gulp.task('images:watch', function() {
  gulp.watch(SRC.images, ['images']);
});

// One-time build; doesn't watch for changes
gulp.task('build', ['js', 'sass', 'css', 'javadoc', 'fonts', 'images']);

// Delete static folder
gulp.task('clean', function() {
  del(DIST.all);
});

// Run in development (i.e. watch) mode
gulp.task('dev', ['build', 'js:watch', 'sass:watch', 'css:watch', 'images:watch']);

// Help => list tasks
gulp.task('help', $.taskListing.withFilters(null, 'help'));

// Default
gulp.task('default', ['help']);
