#! /usr/bin/env node

“use strict”;

var fs = require(“fs”),

path = require("path"),
vm = require("vm"),
traceur = require("traceur"),
nomnom = require("nomnom"),
chalk = require("chalk"),
spider = require("./lib/spider");

var opts = nomnom

.option("files", {
  position: 0,
  help: "files to compile",
  list: true
})
.option("compile", {
  abbr: "c",
  flag: true,
  help: "compile to JavaScript and save as .js files"
})
.option("verbose", {
  abbr: "v",
  flag: true,
  help: "verbose mode"
})
.option("disable-source-map", {
  flag: true,
  help: "disable source map files (.map) generation"
})
.option("target", {
  choices: ["ES6", "ES5"],
  default: "ES5",
  help: "target"
})
.option("version", {
  flag: true,
  help: "display the version number",
  callback: function () {
    return "version " + require("./package.json").version;
  }
})
.parse();

if (!opts.files) {

console.log(nomnom.getUsage());
process.exit(0);

}

var generateSourceMap = !opts && opts.compile; var problems = 0;

opts.files.forEach(function (fileName, fileIndex) {

fs.readFile(fileName, "utf-8", function (error, content) {
  var compilerOutput = spider.compile({
    text: content,
    fileName: fileName,
    target: opts.target,
    generateSourceMap: generateSourceMap
  });

  if (compilerOutput.errors.length > 0) {
    console.log(spider.formatErrors(fileName, content, compilerOutput.errors));
    problems += compilerOutput.errors.length;

    if (problems > 0 && 
        fileIndex === opts.files.length - 1)  {
      console.log(chalk.red(problems + (problems === 1 ? " problem" : " problems")));
    }      
  } else {
    if (opts.compile) {
      var outFileNameWithoutExtension = fileName.substring(0, 
        fileName.lastIndexOf('.'));    

      writeFile(outFileNameWithoutExtension + ".js", 
        compilerOutput.result);

      if (generateSourceMap) {
        writeFile(outFileNameWithoutExtension + ".map", 
          compilerOutput.result);
      }
    } else {
      var sandbox = {};
      for (var key in global) {
        sandbox[key] = global[key];
      }
      var Module, _module, _require;
      Module = require('module');
      sandbox.module = _module = new Module(outFileNameWithoutExtension || 'eval');
      sandbox.require = _require = function(path) {
        return Module._load(path, _module, true);
      };
      _module.filename = sandbox.__filename;
      Object.getOwnPropertyNames(require).forEach(function(r){
        if (r !== 'paths' && r !== 'arguments' && r !== 'caller') {
          _require[r] = require[r];
        }            
      })
      _require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
      _require.resolve = function(request) {
        return Module._resolveFilename(request, _module);
      };
      vm.runInNewContext(compilerOutput.result, sandbox);
    }
  }
});

});

function writeFile(fileName, content) {

fs.writeFile(fileName, content, function (error) {
  if (error) {
    return console.log(error);
  }
});

}