module.exports = function(config, grunt) {
  'use strict';

  var gaze = require('gaze');
  var path = require('path');
  var firstRun = true;
  var done;
  var lastTime;

  grunt.registerTask('watch', function() {
    if (!grunt.option('skip-ts-compile')) {
      grunt.log.writeln('We recommoned starting with: grunt watch --force --skip-ts-compile')
      grunt.log.writeln('Then do incremental typescript builds with: grunt exec:tswatch')
    }

    done = this.async();
    lastTime = new Date().getTime();

    if (firstRun === false) {
      grunt.log.writeln('Watch resuming');
      return;
    }

    gaze(config.srcDir + '/**/*', function(err, watcher) {

      console.log('Gaze watchers setup');

      watcher.on('all', function(evtName, filepath) {
        filepath = path.relative(process.cwd(), filepath);

        // ignore multiple changes at once
        var now = new Date().getTime();
        if (now - lastTime < 100) {
          return;
        }
        lastTime = now;

        var newPath;
        grunt.log.writeln('File Changed: ', filepath);

        if (/(\.html)|(\.json)$/.test(filepath)) {
          newPath = filepath.replace(/^public/, 'public_gen');
          grunt.log.writeln('Copying to ' + newPath);
          grunt.file.copy(filepath, newPath);
        }

        if (/(\.js)$/.test(filepath)) {
          newPath = filepath.replace(/^public/, 'public_gen');
          grunt.log.writeln('Copying to ' + newPath);
          grunt.file.copy(filepath, newPath);

          grunt.task.run('jshint');
          grunt.task.run('jscs');
        }

        if (/(\.scss)$/.test(filepath)) {
          grunt.task.run('clean:css');
          grunt.task.run('css');
        }

        if (/(\.ts)$/.test(filepath)) {
          newPath = filepath.replace(/^public/, 'public_gen');
          grunt.log.writeln('Copying to ' + newPath);
          grunt.file.copy(filepath, newPath);

          if (grunt.option('skip-ts-compile')) {
            grunt.log.writeln('Skipping ts compile, run grunt exec:tswatch to start typescript watcher')
          } else {
            grunt.task.run('exec:tscompile');
          }

          grunt.config('tslint.source.files.src', filepath);
          grunt.task.run('exec:tslintfile');
        }

        done();
        firstRun = false;
        grunt.task.run('watch');
      });
    });
  });
};
