const path = require('path');
let shelljs = require('shelljs');
let proxy = require('../core/proxy');
const Ipc = require('../core/ipc');
const constants = require('../constants.json');
const {defaultHost, dockerHostSwap} = require('../utils/host');

class Simulator {
  constructor(options) {
    this.blockchainConfig = options.blockchainConfig;
    this.logger = options.logger;
  }

  run(options) {
    let cmds = [];

    const ganache = path.join(__dirname, '../../node_modules/.bin/ganache-cli');
    // const testrpc = shelljs.which('testrpc');
    // const ganache = shelljs.which('ganache-cli');
    // if (!testrpc && !ganache) {
    //   this.logger.warn(__('%s is not installed on your machine', 'Ganache CLI (TestRPC)'));
    //   this.logger.info(__('You can install it by running: %s', 'npm -g install ganache-cli'));
    //   process.exit();
    // }

    let useProxy = this.blockchainConfig.proxy || false;
    let host = (dockerHostSwap(options.host || this.blockchainConfig.rpcHost) || defaultHost);
    let port = (options.port || this.blockchainConfig.rpcPort || 8545);

    cmds.push("-p " + (port + (useProxy ? constants.blockchain.servicePortOnProxy : 0)));
    if (!ganache) {
      cmds.push("-h " + host);
    }
    cmds.push("-a " + (options.numAccounts || 10));
    cmds.push("-e " + (options.defaultBalance || 100));
    cmds.push("-l " + (options.gasLimit || 8000000));

    // adding mnemonic only if it is defined in the blockchainConfig or options
    let simulatorMnemonic = this.blockchainConfig.simulatorMnemonic || options.simulatorMnemonic;
    if (simulatorMnemonic) {
      cmds.push("--mnemonic \"" + (simulatorMnemonic) +"\"");
    }

    // adding blocktime only if it is defined in the blockchainConfig or options
    let simulatorBlocktime = this.blockchainConfig.simulatorBlocktime || options.simulatorBlocktime;
    if (simulatorBlocktime) {
      cmds.push("-b \"" + (simulatorBlocktime) +"\"");
    }

    // const programName = ganache ? 'ganache-cli' : 'testrpc';
    // const program = ganache ? ganache : testrpc;
    const programName = 'ganache-cli';
    const program = ganache;
    console.log(`running: ${programName} ${cmds.join(' ')}`);
    shelljs.exec(`${program} ${cmds.join(' ')}`, {async : true});

    if(useProxy){
      let ipcObject = new Ipc({ipcRole: 'client'});
      proxy.serve(ipcObject, host, port, false);
    }
    
  }
}

module.exports = Simulator;

@@ -1177,24 +1177,27 @@
  : 0)));%0A   
+ //
  if (!ganach
@@ -1196,32 +1196,35 @@
 (!ganache) %7B%0A   
+ //
    cmds.push(%22-h
@@ -1234,24 +1234,27 @@
 + host);%0A   
+ //
  %7D%0A    cmds.

disable dead code path -- ganache will never be falsy