var program = require('commander');
var colors = require('colors');
var shelljs = require('shelljs');
var promptly = require('promptly');
var path = require('path');

var Cmd = function(Embark) {
  this.Embark = Embark;
  program.version(Embark.version);
};


Cmd.prototype.process = function(args) {
  this.newApp();
  this.demo();
  this.build();
  this.run();
  this.blockchain();
  this.simulator();
  this.test();
  this.upload();
  this.otherCommands();

  //If no arguments are passed display help by default
  if (!process.argv.slice(2).length) {
    program.help();
  }
  
  program.parse(args);
};

Cmd.prototype.newApp = function() {
  var self = this;

  var validateName = function (value) {
    try  {
      if(value.match(/^[a-zA-Z\s\-]+$/)) return value;
    } catch (e) {
      throw new Error('Name must be only letters, spaces, or dashes');
    }
  };

  program
    .command('new [name]')
    .description('new application')
    .action(function (name, options) {
      var parentDirectory = path.dirname(__dirname).split("/").pop();
      if (name === undefined) {
        return promptly.prompt("Name your app: (default: " + parentDirectory + ")", {
          default: parentDirectory,
          validator: validateName
        }, function (err, inputvalue) {
          if (err) {
            console.error('Invalid name:', err.message);
            // Manually call retry
            // The passed error has a retry method to easily prompt again.
            return err.retry();
          } else {
            //slightly different assignment of name since it comes from child prompt
            return self.Embark.generateTemplate('boilerplate', parentDirectory, inputvalue);
          }
        });
      }

      self.Embark.generateTemplate('boilerplate', './', name);
    });
};

Cmd.prototype.demo = function() {
  var self = this;
  program
  .command('demo')
  .description('create a working dapp with a SimpleStorage contract')
  .action(function() {
    self.Embark.generateTemplate('demo', './', 'embark_demo');
  });
};

Cmd.prototype.build = function() {
  var self = this;
  program
  .command('build [environment]')
  .description('deploy and build dapp at dist/ (default: development)')
  .action(function(env, options) {
    self.Embark.build({env: env || 'development'});
  });
};

Cmd.prototype.run = function() {
  var self = this;
  program
  .command('run [environment]')
  .option('-p, --port [port]', 'port to run the dev webserver (default: 8000)')
  .option('-b, --host [host]', 'host to run the dev webserver (default: localhost)')
  .option('--noserver', 'disable the development webserver')
  .option('--nodashboard', 'simple mode, disables the dashboard')
  .option('--no-color', 'no colors in case it\'s needed for compatbility purposes')
  .description('run dapp (default: development)')
  .action(function(env, options) {
    self.Embark.run({
      env: env || 'development',
      serverPort: options.port,
      serverHost: options.host,
      runWebserver: !options.noserver,
      useDashboard: !options.nodashboard
    });
  });
};

Cmd.prototype.blockchain = function() {
  var self = this;
  program
  .command('blockchain [environment]')
  .option('-c, --client [client]', 'Use a specific ethereum client or simulator (supported: geth, parity, ethersim, testrpc')
  .description('run blockchain server (default: development)')
  .action(function(env ,options) {
    self.Embark.initConfig(env || 'development', {
        embarkConfig: 'embark.json',
        interceptLogs: false
    });
    self.Embark.blockchain(env || 'development', options.client || 'geth');
  });
};

Cmd.prototype.simulator = function() {
  var self = this;
  program
  .command('simulator [environment]')
  .description('run a fast ethereum rpc simulator')
  .option('--testrpc', 'use testrpc as the rpc simulator [default]')
  .option('-p, --port [port]', 'port to run the rpc simulator (default: 8000)')
  .option('-h, --host [host]', 'host to run the rpc simulator (default: localhost)')
  .action(function(env, options) {
    self.Embark.initConfig(env || 'development', {
        embarkConfig: 'embark.json',
        interceptLogs: false
    });
    self.Embark.simulator({port: options.port, host: options.host});
  });
};

Cmd.prototype.test = function() {
  program
  .command('test')
  .description('run tests')
  .action(function() {
    shelljs.exec('mocha test');
  });
};

Cmd.prototype.upload = function() {
  var self = this;
  program
  .command('upload [platform] [environment]')
  .description('upload your dapp to a decentralized storage. possible options: ipfs, swarm (e.g embark upload swarm)')
  .action(function(platform, env, options) {
    // TODO: get env in cmd line as well
    self.Embark.initConfig(env || 'development', {
        embarkConfig: 'embark.json', interceptLogs: false
    });
    self.Embark.upload(platform);
  });
};

Cmd.prototype.otherCommands = function() {
  program
  .action(function(env){
    console.log('unknown command "%s"'.red, env);
    console.log("type embark --help to see the available commands");
    process.exit(0);
  });
};

module.exports = Cmd;

@@ -1475,23 +1475,16 @@
         
-return 
 err.retr
@@ -1604,23 +1604,16 @@
         
-return 
 self.Emb

remove unneccesary returns