var run = function() {
  bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
  var networks = require('../networks');
  var WalletKey = bitcore.WalletKey;
  var Script = bitcore.Script;
  var Builder = bitcore.TransactionBuilder;
  var opts = {
    network: networks.testnet
  };

  console.log('## Network: ' + opts.network.name);

  var input = {};
  input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp";
  input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V";

  // Complete with the corresponding UTXO you want to use
  var utxos = [{
    address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp",
    txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5",
    vout: 1,
    ts: 1396290442,
    scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac",
    amount: 0.3795,
    confirmations: 7
  }];

  var privs = [
    "cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA",
    "cVf32m9MR4vxcPwKNJuPepUe8XrHD2z63eCk76d6njRGyCkXpkSM",
    "cQ2sVRFX4jQYMLhWyzz6jTQ2xju51P36968ecXnPhRLKLH677eKR",
    "cSw7x9ERcmeWCU3yVBT6Nz7b9JiZ5yjUB7JMhBUv9UM7rSaDpwX9",
    "cRQBM8qM4ZXJGP1De4D5RtJm7Q6FNWQSMx7YExxzgn2ehjM3haxW",
  ];

  var pubkeys = []
  privs.forEach(function(p) {
    var wk = new WalletKey(opts);
    wk.fromObj({
      priv: p
    });
    pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public));
  });

  // multisig p2sh
  var opts = {
    nreq: 3,
    pubkeys: pubkeys
  };

  // p2scriphash p2sh
  //var opts = [{address: an_address}];

  var info = Builder.infoForP2sh(opts, 'testnet');
  var p2shScript = info.scriptBufHex;
  var p2shAddress = info.address;


  var outs = [{
    address: p2shAddress,
    amount: 0.05
  }];
  var tx = new Builder(opts)
    .setUnspent(utxos)
    .setOutputs(outs)
    .sign([input.priv])
    .build();

  var txHex = tx.serialize().toString('hex');


  console.log('## p2sh address: ' + p2shAddress); //TODO
  console.log('\n1) SEND TO P2SH TX: ', txHex);
  console.log('[this example originally generated TXID: c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7 on testnet]\n\n\thttp://test.bitcore.io/tx/c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7\n\n');

  //save scriptPubKey
  var scriptPubKey = tx.outs[0].s.toString('hex');

  /* 
   *
   * REDDEEM TX
   */
  var utxos2 = [{
    address: p2shAddress,
    txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7",
    vout: 0,
    ts: 1396375187,
    scriptPubKey: scriptPubKey,
    amount: 0.05,
    confirmations: 1
  }];

  outs = [{
    address: input.addr,
    amount: 0.04
  }];

  var hashMap = {};
  hashMap[p2shAddress] = p2shScript;

  var b = new Builder(opts)
    .setUnspent(utxos2)
    .setHashToScriptMap(hashMap)
    .setOutputs(outs)
    .sign(privs);

  tx = b.build();


  console.log('Builder:');
  console.log('\tSignatures:' + tx.countInputMissingSignatures(0));
  console.log('\t#isFullySigned:' + b.isFullySigned());

  console.log('TX:');
  console.log('\t #isComplete:' + tx.isComplete());

  var txHex = tx.serialize().toString('hex');
  console.log('2) REDEEM SCRIPT: ', txHex);
  console.log('[this example originally generated TXID: 8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7 on testnet]\n\n\thttp://test.bitcore.io/tx/8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7\n\n');

  /*
  // To send TX with RPC:
  var RpcClient = bitcore.RpcClient;
  var config = {
    protocol: 'http',
    user: 'user',
    pass: 'pass',
    host: '127.0.0.1',
    port: '18332',
  };
  var rpc = new RpcClient(config);
  rpc.sendRawTransaction(txHex, function(err, ret) {
    console.log('err', err); //TODO
    console.log('ret', ret); //TODO
    process.exit(-1);
  });
};
*/

};


// This is just for browser & mocha compatibility
if (typeof module !== 'undefined') {
  module.exports.run = run;
  if (require.main === module) {
    run();
  }
} else {
  run();
}