var Through = require('through2');
var Revisioner = require('./revisioner');
var gutil = require('gulp-util');
var PluginError = gutil.PluginError;

var PLUGIN_NAME = 'gulp-rev-all';

module.exports = {
  
  revision: function(options) {

    var revisioner = new Revisioner(options);

    // Feed the RevAll Revisioner with all the files in the stream, don't emit them until all of them have been processed
    return Through.obj(function (file, enc, callback) {

      if (file.isStream()) {
        this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported!'));      
        return callback();
      }

      if (file.isBuffer()) {
        revisioner.processFile(file);
      }

      file.revisioner = revisioner;

      callback();

    }, function (callback) {

      revisioner.run();

      var files = revisioner.files;
      for (var filename in files) {
        this.push(files[filename]);
      }
      callback();

    });

  },

  versionFile: function() {

    var revisioner;

    // Drop any existing files off the stream, push the generated version file
    return Through.obj(function (file, enc, callback) {

      if (!revisioner) {
        revisioner = file.revisioner;
      }

      // Drop any existing files off the stream
      callback();

    }, function (callback) {

      if (!revisioner) {
        this.emit('error', new PluginError(PLUGIN_NAME, 'revision() must be called first!'));
        return callback();
      }

      this.push(revisioner.versionFile());
      callback();

    });


  },

  manifestFile: function() {

    var revisioner;

    // Drop any existing files off the stream, push the generated manifest file
    return Through.obj(function (file, enc, callback) {

      if (!revisioner) {
        revisioner = file.revisioner;
      }
      callback();

    }, function (callback) {

      if (!revisioner) {
        this.emit('error', new PluginError(PLUGIN_NAME, 'revision() must be called first!'));
        return callback();
      }

      this.push(revisioner.manifestFile());
      callback();

    });

  }

};
