'use strict';
module.exports = function (grunt) {
  grunt.registerMultiTask('rat', 'Run Apache Rat', function () {
    var path = require('path');
    var chalk = require('chalk');
    var childProcess = require('child_process');
    var xml2js = require('xml2js');

    var cb = this.async();

    var options = this.options({ xml : true, tmpdir : './build/tmp'});
    var dir = this.data.dir;
    var out = options.tmpdir + '/' + (options.xml ? 'rat.xml' : 'rat.txt');

    
    var pathToRat =  path.resolve(__dirname,'./../tools/apache-rat-0.10/apache-rat-0.10.jar');
    
    //sample command java -jar apache-rat-0.10.jar -x -d ./src > ./build/tmp/rat.txt
    var cmd = 'java -jar ' + pathToRat;
    cmd += options.xml ? ' -x' : '';

    cmd += ' -d ' + dir;
    cmd += ' > ' + out;

    var cp = childProcess.exec(cmd, options.execOptions, function (err, stdout, stderr) {
      if (err) {
        grunt.fail.warn('rat --> ' + err, 1); //abort Grunt immediately with error code 1
      }
      grunt.verbose.writeln('Rat['+dir+']:');
      if (!options.xml) {
        grunt.fail.warn('rat --> ' + 'No XML output: checkRatLogFile skipped!', 1); //abort Grunt immediately with error code 1
      }
      var xml = grunt.file.read(out);
      var parser = new xml2js.Parser();
      parser.parseString(xml, function (err, result) {
          if (err) {
            grunt.fail.warn('rat --> ' + err, 1); //abort Grunt immediately with error code 1
          }
          
          //
          if (checkRatLogFile(result)) {
            grunt.fail.warn('rat --> ' + 'Missing or Invalied license header detected ( see "'+out+'")', 1);
          }

          //
          cb();
      });
    }.bind(this));

    var checkRatLogFile = function(result) {

      var list = result['rat-report']['resource'];
      for (var i = 0; i < list.length; i++ ){
        var item = list[i];

        var headerType = list[i]['header-type'];
        var attr = headerType[0]['$'];
        if (attr.name.trim() !== 'AL') {
          return true;
        }
      }
      return false;
    }

    var captureOutput = function (child, output) {
      if (grunt.option('color') === false) {
        child.on('data', function (data) {
          output.write(chalk.stripColor(data));
        });
      } else {
        child.pipe(output);
      }
    };

    grunt.verbose.writeln('Command:', chalk.yellow(cmd));

    captureOutput(cp.stdout, process.stdout);
      captureOutput(cp.stderr, process.stderr);

    if (options.stdin) {
      process.stdin.resume();
      process.stdin.setEncoding('utf8');
      process.stdin.pipe(cp.stdin);
    }
  });
};

