var utils = require("../utils.js");
var config = require("../config.js");
var coins = require("../coins.js");

var SHA256 = require("crypto-js/sha256");
var earliestBlockTime = 1231006505;
var avgBlockTime = 200000;
var currentBlockHeight = 1234567;


function getBlockchainInfo() {
	return new Promise(function(resolve, reject) {
		resolve({
			blocks: currentBlockHeight
		});
	});
}

function getNetworkInfo() {
	return getRpcData("getnetworkinfo");
}

function getNetTotals() {
	return getRpcData("getnettotals");
}

function getMempoolInfo() {
	return getRpcData("getmempoolinfo");
}

function getUptimeSeconds() {
	return getRpcData("uptime");
}

function getRawMempool() {
	return getRpcDataWithParams("getrawmempool", true);
}

function getBlockByHeight(blockHeight) {
	var txCount = utils.seededRandomIntBetween(blockHeight, 1, 20);
	var txids = [];
	for (var i = 0; i < txCount; i++) {
		txids.push(SHA256("" + blockHeight + "_" + i));
	}

	return new Promise(function(resolve, reject) {
		resolve({
			"hash": SHA256("" + blockHeight),
			"confirmations": currentBlockHeight - blockHeight,
			"strippedsize": 56098,
			"size": 65384,
			"weight": 233678,
			"height": blockHeight,
			"version": 536870912,
			"versionHex": "20000000",
			"merkleroot": "567a3d773b07372179ad651edc02776f851020af69b7375a68ad89557dcbff5b",
			"tx": txids,
			"time": 1529848136,
			"mediantime": 1529846560,
			"nonce": 3615953854,
			"bits": "17376f56",
			"difficulty": "5077499034879.017",
			"chainwork": SHA256("xyz" + blockHeight),
			"previousblockhash": SHA256("" + (blockHeight - 1)),
			"nextblockhash": SHA256("" + (blockHeight + 1))
		});
	});
}

function getBlocksByHeight(blockHeights) {
	console.log("mock.getBlocksByHeight: " + blockHeights);
	return new Promise(function(resolve, reject) {
		var blocks = [];
		for (var i = 0; i < blockHeights.length; i++) {
			getBlockByHeight(blockHeights[i]).then(function(result) {
				blocks.push(result);
			});
			/*blocks.push({
				"hash": "000000000000000000001542470d8261b9e5a2c3c2be2e2ab292d1a4c8250b12",
				"confirmations": 3,
				"strippedsize": 56098,
				"size": 65384,
				"weight": 233678,
				"height": blockHeights[i],
				"version": 536870912,
				"versionHex": "20000000",
				"merkleroot": "567a3d773b07372179ad651edc02776f851020af69b7375a68ad89557dcbff5b",
				"tx": [
					"a97a04ebcaaca0ec80a6b2f295171eb8b082b4bc5446cd085444c304dca6f014",
					"223fdd9cae01f3253adc0f0133cc8e6bebdb6f1481dfa0cd9cbfebff656f32f8",
					"e999b2b8f1ee1e0b1adcc138d96d16e4fb65f2b422fc08d59a3b306b6a5c73d6",
					"328ae013c7870ab29ffd93e1a1c01db6205229f261a91a04e73539c99861923f",
					"b0604a447db9a0170a10a8d6cd2d68258783ae3061e5bfe5e26bcb6e76728c08",
				],
				"time": 1529848136,
				"mediantime": 1529846560,
				"nonce": 3615953854,
				"bits": "17376f56",
				"difficulty": "5077499034879.017",
				"chainwork": "00000000000000000000000000000000000000000226420affb91a60111258b4",
				"previousblockhash": "0000000000000000003147c5229962ca4e38714fc5aee8cf38670cf1a4ef297b",
				"nextblockhash": "0000000000000000003382a0eef5b127c5d5ea270c85d9db3f3c605d32287cc5"
			});*/
		}

		resolve(blocks);
	});
}

function getBlockByHash(blockHash) {
	return new Promise(function(resolve, reject) {
		resolve({
			"hash": blockHash,
			"confirmations": 3,
			"strippedsize": 56098,
			"size": 65384,
			"weight": 233678,
			"height": 123456,
			"version": 536870912,
			"versionHex": "20000000",
			"merkleroot": "567a3d773b07372179ad651edc02776f851020af69b7375a68ad89557dcbff5b",
			"tx": [
				"a97a04ebcaaca0ec80a6b2f295171eb8b082b4bc5446cd085444c304dca6f014",
				"223fdd9cae01f3253adc0f0133cc8e6bebdb6f1481dfa0cd9cbfebff656f32f8",
				"e999b2b8f1ee1e0b1adcc138d96d16e4fb65f2b422fc08d59a3b306b6a5c73d6",
				"328ae013c7870ab29ffd93e1a1c01db6205229f261a91a04e73539c99861923f",
				"b0604a447db9a0170a10a8d6cd2d68258783ae3061e5bfe5e26bcb6e76728c08",
			],
			"time": 1529848136,
			"mediantime": 1529846560,
			"nonce": 3615953854,
			"bits": "17376f56",
			"difficulty": "5077499034879.017",
			"chainwork": "00000000000000000000000000000000000000000226420affb91a60111258b4",
			"previousblockhash": "0000000000000000003147c5229962ca4e38714fc5aee8cf38670cf1a4ef297b",
			"nextblockhash": "0000000000000000003382a0eef5b127c5d5ea270c85d9db3f3c605d32287cc5"
		});
	});
}

function getBlocksByHash(blockHashes) {
	return new Promise(function(resolve, reject) {
		var blocks = [];
		for (var i = 0; i < blockHashes.length; i++) {
			blocks.push({
				"hash": blockHashes[i],
				"confirmations": 3,
				"strippedsize": 56098,
				"size": 65384,
				"weight": 233678,
				"height": 123456,
				"version": 536870912,
				"versionHex": "20000000",
				"merkleroot": "567a3d773b07372179ad651edc02776f851020af69b7375a68ad89557dcbff5b",
				"tx": [
					"a97a04ebcaaca0ec80a6b2f295171eb8b082b4bc5446cd085444c304dca6f014",
					"223fdd9cae01f3253adc0f0133cc8e6bebdb6f1481dfa0cd9cbfebff656f32f8",
					"e999b2b8f1ee1e0b1adcc138d96d16e4fb65f2b422fc08d59a3b306b6a5c73d6",
					"328ae013c7870ab29ffd93e1a1c01db6205229f261a91a04e73539c99861923f",
					"b0604a447db9a0170a10a8d6cd2d68258783ae3061e5bfe5e26bcb6e76728c08",
				],
				"time": 1529848136,
				"mediantime": 1529846560,
				"nonce": 3615953854,
				"bits": "17376f56",
				"difficulty": "5077499034879.017",
				"chainwork": "00000000000000000000000000000000000000000226420affb91a60111258b4",
				"previousblockhash": "0000000000000000003147c5229962ca4e38714fc5aee8cf38670cf1a4ef297b",
				"nextblockhash": "0000000000000000003382a0eef5b127c5d5ea270c85d9db3f3c605d32287cc5"
			});
		}

		resolve(blocks);
	});
}

function getRawTransaction(txid) {
	return new Promise(function(resolve, reject) {
		resolve({
			"txid": txid,
			"hash": txid,
			"version": 1,
			"size": 237,
			"vsize": 210,
			"locktime": 0,
			"vin": [
				{
					"coinbase": "03851208fabe6d6d7bf60491521f081d77fa018fb41a167dd447bf20e7d2487426c3cee65332cdb50100000000000000266508019fcf7fcb7b01002ffd0c2f736c7573682f",
					"sequence": 0
				}
			],
			"vout": [
				{
					"value": 12.51946416,
					"n": 0,
					"scriptPubKey": {
						"asm": "OP_DUP OP_HASH160 7c154ed1dc59609e3d26abb2df2ea3d587cd8c41 OP_EQUALVERIFY OP_CHECKSIG",
						"hex": "76a9147c154ed1dc59609e3d26abb2df2ea3d587cd8c4188ac",
						"reqSigs": 1,
						"type": "pubkeyhash",
						"addresses": [
							"1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE"
						]
					}
				},
				{
					"value": 0,
					"n": 1,
					"scriptPubKey": {
						"asm": "OP_RETURN aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b986281",
						"hex": "6a24aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b986281",
						"type": "nulldata"
					}
				}
			],
			"hex": "010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4503851208fabe6d6d7bf60491521f081d77fa018fb41a167dd447bf20e7d2487426c3cee65332cdb50100000000000000266508019fcf7fcb7b01002ffd0c2f736c7573682f0000000002b02f9f4a000000001976a9147c154ed1dc59609e3d26abb2df2ea3d587cd8c4188ac0000000000000000266a24aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b9862810120000000000000000000000000000000000000000000000000000000000000000000000000",
			"blockhash": "000000000000000000001542470d8261b9e5a2c3c2be2e2ab292d1a4c8250b12",
			"confirmations": 3,
			"time": 1529848136,
			"blocktime": 1529848136
		});
	});
}

function getAddress(address) {
	return getRpcDataWithParams("validateaddress", address);
}

function getRawTransactions(txids) {
	return new Promise(function(resolve, reject) {
		var txs = [];
		for (var i = 0; i < txids.length; i++) {
			txs.push({
				"txid": txid,
				"hash": txid,
				"version": 1,
				"size": 237,
				"vsize": 210,
				"locktime": 0,
				"vin": [
					{
						"coinbase": "03851208fabe6d6d7bf60491521f081d77fa018fb41a167dd447bf20e7d2487426c3cee65332cdb50100000000000000266508019fcf7fcb7b01002ffd0c2f736c7573682f",
						"sequence": 0
					}
				],
				"vout": [
					{
						"value": 12.51946416,
						"n": 0,
						"scriptPubKey": {
							"asm": "OP_DUP OP_HASH160 7c154ed1dc59609e3d26abb2df2ea3d587cd8c41 OP_EQUALVERIFY OP_CHECKSIG",
							"hex": "76a9147c154ed1dc59609e3d26abb2df2ea3d587cd8c4188ac",
							"reqSigs": 1,
							"type": "pubkeyhash",
							"addresses": [
								"1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE"
							]
						}
					},
					{
						"value": 0,
						"n": 1,
						"scriptPubKey": {
							"asm": "OP_RETURN aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b986281",
							"hex": "6a24aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b986281",
							"type": "nulldata"
						}
					}
				],
				"hex": "010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4503851208fabe6d6d7bf60491521f081d77fa018fb41a167dd447bf20e7d2487426c3cee65332cdb50100000000000000266508019fcf7fcb7b01002ffd0c2f736c7573682f0000000002b02f9f4a000000001976a9147c154ed1dc59609e3d26abb2df2ea3d587cd8c4188ac0000000000000000266a24aa21a9ed2b367f88dbcc39b83e89703d5425a9b51fa3d2d921b8f39a42bc54492b9862810120000000000000000000000000000000000000000000000000000000000000000000000000",
				"blockhash": "000000000000000000001542470d8261b9e5a2c3c2be2e2ab292d1a4c8250b12",
				"confirmations": 3,
				"time": 1529848136,
				"blocktime": 1529848136
			});
		}

		resolve(txs);
	});
}

function getMinerFromCoinbaseTx(tx) {
	return null;
}

function getHelp() {
	return new Promise(function(resolve, reject) {
		reject("Not implemented");
	});
}

function getRpcMethodHelp(methodName) {
	return new Promise(function(resolve, reject) {
		reject("Not implemented");
	});
}



module.exports = {
	getBlockchainInfo: getBlockchainInfo,
	getNetworkInfo: getNetworkInfo,
	getNetTotals: getNetTotals,
	getMempoolInfo: getMempoolInfo,
	getBlockByHeight: getBlockByHeight,
	getBlocksByHeight: getBlocksByHeight,
	getBlockByHash: getBlockByHash,
	getRawTransaction: getRawTransaction,
	getRawTransactions: getRawTransactions,
	getRawMempool: getRawMempool,
	getUptimeSeconds: getUptimeSeconds,
	getHelp: getHelp,
	getRpcMethodHelp: getRpcMethodHelp,
	getAddress: getAddress
};