var loadContractInstances = function(event) {
	console.log("loadContractInstances"+event);

	listContractProcess();
};

var listContractProcess = function(event) {
	console.log("listContractProcess"+event);
	setTimeout(function() {
		var param = {};
		param.action = "listContractProcess";

		// param.data = event;

		global.wssocket.send(JSON.stringify(param));
		var request2 = {};
        request2.action = "listLeakContractProcess";
        global.wssocket.send(JSON.stringify(request2));
	}, 300);
};

var onListContractProcess1 = function(obj) {
	console.log("+++++++++="+obj.data);
	var table = JSON.parse(obj.data);
	global.contractList = table;
	drawContractInstanceStatusPie(table);
	// drawContractInstanceTimesPie(table);
	drawContractInstanceTypeTimesPie(table);
	drawciTable(table);
	console.log(table);
	$("#selectContractInstance").html("");
	var x = document.getElementById("selectContractInstance");
	x.options.length = 0;
	x.add(new Option("选择...", " "));

	global.permissionNameMap = {};
	for (var i = 0; i < table.length; i++) {
		var option = document.createElement("option");
		option.text = table[i].name;
		console.log(table[i].name);
		global.permissionNameMap[table[i].id] = table[i].contractPermission;
		// option.value=table[i].id;
		option.value = table[i].id;
		x.add(option, null);
	}
};

var drawciTable = function(table) {
	if ($("#ciTabDiv").css("height") == "0px") {
		console.log("drawciTabDiv: ignore");
		return;
	}
	var dtLang = {
		"sProcessing" : "处理中...",
		"lengthMenu" : '显示 <select>' + '<option value="10">10</option>'
				+ '<option value="50">50</option>'
				+ '<option value="100">100</option>'
				+ '<option value="-1">全部</option>' + '</select> 项结果',
		"sZeroRecords" : "没有匹配结果",
		"sInfo" : "显示第 _START_ 至 _END_ 项结果，共 _TOTAL_ 项",
		"sInfoEmpty" : "显示第 0 至 0 项结果，共 0 项",
		"sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
		"sInfoPostFix" : "",
		"sSearch" : "搜索:",
		"sUrl" : "",
		"sEmptyTable" : "表中数据为空",
		"sLoadingRecords" : "载入中...",
		"sInfoThousands" : ",",
		"oPaginate" : {
			"sFirst" : "首页",
			"sPrevious" : "上页",
			"sNext" : "下页",
			"sLast" : "末页"
		},
		"oAria" : {
			"sSortAscending" : ": 以升序排列此列",
			"sSortDescending" : ": 以降序排列此列"
		}
	};
	var tableHead = "<table id='ciTabDivTab' class='table display row-border' style='word-break:normal; word-break:keep-all'><thead><tr><th>序号</th><th>ID</th><th>名称</th><th>状态</th><th>端口</th><th>类型</th><th>通讯</th><th>共识</th><th>统计</th><th>次数</th><th>流量</th><th>内存</th><th>管理</th></tr></thead><tbody>";
	var tableTail = "</tbody></table>";

	console.log("drawciTable");
	var html = tableHead;
	for (var i = 0; i < table.length; i++) {
		html += "<tr><td>";
		html += (i + 1);
		html += "</td> <td>";
		html += table[i].id;
		html += "</td> <td>";
		html += "<a href='/client/bdwareclient.html?self=true&contract="
				+ table[i].id + "' target='_blank'>" + table[i].name + "</>";
		html += "</td> <td>";
		html += table[i].contractStatus;
		html += "</td> <td>";
		html += table[i].port;
		html += "</td><td>";
		html += table[i].type;
		html += "</td> <td>";
		html += table[i].networkType == 0?"TCP":"P2P";
		html += "</td><td>";
		var consensusType;
		switch(table[i].consensusType) {
			case 0:
				consensusType = "无";
				break;
			case 1:
				consensusType = "PBFT";
				break;
			case 2:
				consensusType = "RAFT";
				break;
			case 3:
				consensusType = "Single";
				break;
		}
		html += consensusType;
		html += "</td><td>";
		var responseType;
		switch(table[i].responseType) {
			case 0:
				responseType = "ALL";
				break;
			case 1:
				responseType = "MOST";
				break;
			case 2:
				responseType = "FIRST";
				break;
		}
		html += responseType;
		html += "</td><td>";
		html += table[i].times;
		table[i].port;
		html += "</td> <td>";
		html += table[i].traffic;
		html += "</td> <td>";
		html += table[i].storage;
		html += "</td> <td style='padding:2px 12px 2px 12px'>";
		html +="<button onclick='stopContractByID(\""+table[i].id+"\")' class='btn btn-secondary'>"+"停止</button>"
		//table[i].resultCheck;
		// html += "</td> <td>";
		// html += "<button class='btn btn-outline-secondary' type='button'
		// onclick='viewContractInstance("+ table[i].contractID +
		// ")'>更多</button>";
		html += "</td> </tr>";
	}
	html += tableTail;
	html = "<h5 class='card-title'>合约实例列表</h5>"+html;
	$("#ciTabDiv").html(html);

	$("#ciTabDivTab").DataTable(
			{
				"language" : dtLang,
				"rowCallback" : function(row, data, displayNum, displayIndex,
						dataIndex) {

				},
				"headerCallback" : function(thead, data, start, end, display) {
					$(thead).css("background", primaryColor);
					$(thead).css("color", "white");
					$(thead).children().css("background", primaryColor);
					$(thead).children().css("color", "white");
				},
				scrollCollapse : false,
				paging : true,
				pageLength : 10,
				order : [ [ 0, 'desc' ] ],
				"columnDefs" : [
				    {
                        "targets" : 1,
                        "render" : function(data, type, row, meta) {
                            if (data.length > 8)
                               return "<span title='" + data + "'>"
                                       + data.substring(0, 8)
                                       + "  ...</span>";
                            else
                                return data;
                        }

                    },]
			});
};
var stopContractByID = function(contractID){
    $("#dialogBodyDiv").html("是否停止合约，ContractID:"+contractID);
    showDialog("请确认",function(){
        var request = {};
   	    request.action = "killContractProcess";
   	    request.requestID = new Date().getTime() + "";
   	    request.id = contractID;
   	    global.wssocket.send(JSON.stringify(request));
    });
};
var drawContractInstanceStatusPie = function(table) {
	if ($("#ciStatusPieDiv").css("height") == "0px") {
		console.log("drawContractInstanceStatusPie: ignore");
		return;
	}
	$("#ciStatusPieDiv")
			.html(
					"<div class='col-12' id='ciStatusPieDivCanv' style='width:100%; min-height: 150px; padding: 0px'></div>");
	var result = {};
	for (var i = 0; i < table.length; i++) {
		var obj = table[i];
		if (result[obj.contractStatus] == undefined) {
			result[obj.contractStatus] = 1;
		} else
			result[obj.contractStatus]++;
	}
	global.result = result;
	var dataList = [];
	var valDataList = [];
	for ( var key in result) {
		dataList.push(key);
		var l = {};
		l.name = key
		l.value = result[key];
		valDataList.push(l);
	}

	var myChart = echarts.init($("#ciStatusPieDivCanv")[0], 'walden');
	var option222 = {
		tooltip : {
			trigger : 'item',
			formatter : '{a} <br/>{b}: {c} ({d}%)'
		},
		legend : {
			orient : 'vertical',
			left : 10,
			data : dataList
		},
		series : [ {
			name : '合约实例状态',
			type : 'pie',
			radius : [ '50%', '70%' ],
			avoidLabelOverlap : false,
			label : {
				normal : {
					show : false,
					position : 'center'
				},
				emphasis : {
					show : true,
					textStyle : {
						fontSize : '15',
						fontWeight : 'bold'
					}
				}
			},
			labelLine : {
				normal : {
					show : false
				}
			},
			data : valDataList
		} ]
	};
	myChart.setOption(option222);
};

var drawContractInstanceTimesPie = function(table) {
	if ($("#ciTimesPieDiv").css("height") == "0px") {
		console.log("drawContractInstanceTimesPie: ignore");
		return;
	}
	$("#ciTimesPieDiv")
			.html(
					"<div class='col-12' id='ciTimesPieDivCanv' style='width:100%; min-height: 150px; padding: 0px'></div>");
	var result = {};
	for (var i = 0; i < table.length; i++) {
		var obj = table[i];
		result[obj.name] = obj.times;
	}
	global.result = result;
	var dataList = [];
	var valDataList = [];
	for ( var key in result) {
		dataList.push(key);
		var l = {};
		l.name = key
		l.value = result[key];
		valDataList.push(l);
	}

	var myChart = echarts.init($("#ciTimesPieDivCanv")[0], 'walden');

	var option222 = {
		tooltip : {
			trigger : 'item',
			formatter : '{a} <br/>{b}: {c} ({d}%)'
		},
		legend : {
			orient : 'vertical',
			left : 10,
			data : dataList
		},
		series : [ {
			name : '实例调用次数',
			type : 'pie',
			radius : [ '50%', '70%' ],
			avoidLabelOverlap : false,
			label : {
				normal : {
					show : false,
					position : 'center'
				},
				emphasis : {
					show : true,
					textStyle : {
						fontSize : '15',
						fontWeight : 'bold'
					}
				}
			},
			labelLine : {
				normal : {
					show : false
				}
			},
			data : valDataList
		} ]
	};
	myChart.setOption(option222);
};

var changeContractInstance = function(obj) {
	console.log(obj);
	global.contractInstance = obj;

	console.log(typeof(obj));
	showPermissionList(global.contractInstance);

	var contract;
	for (var i = 0; i < global.contractList.length; i++) {
		if (global.contractList[i].id == obj) {
			contract = global.contractList[i];
			global.instance = contract;
			global.instanceName = contract.name;
			global.instanceSequencing = contract.type;
			global.useP2P = contract.useP2P;
			listMemoryFiles(contract.name);
			getSyncType(contract.name);
			break;
		}
	}

	$("#selectContractFunction").html("");
	var x = document.getElementById("selectContractFunction");
	x.options.length = 0;
	x.add(new Option("选择方法...", " "));
	console.log("contract ", contract);
	for (var i = 0; i < contract.exportedFunctions.length; i++) {
		var option = document.createElement("option");
		option.text = contract.exportedFunctions[i].functionName;
		option.value = contract.exportedFunctions[i].functionName;
		x.add(option, null);
	}
};

var changeMemeryFiles = function(obj) {
	console.log(obj);
	global.memoryFile = obj;
};

var executeContractWithDynamicResult = function() {
	console.log("executeContractWithDynamicResult");
	var request = {};
	request.action = "executeContract";
	request.requestID = new Date().getTime() + "";
	request.contractName = global.contractInstance;
	request.sequencing = global.instanceSequencing;
	request.useP2P = global.useP2P;
	var operation = $("#selectContractFunction")[0].value;
	if (operation == " " && operation == undefined) {
		myToast("执行合约", "请选择合约方法！");
		return;
	}
	request.arg = "{\"action\":\"" + operation + "\",\"arg\":\""
			+ $("#arg")[0].value + "\"}";
	request.pubkey = global.sm2Key.publicKey;
	request.withDyanmicAnalysis = true;
	request.signature = sm2.doSignature(request.contractID + "|" + operation
			+ "|" + $("#arg")[0].value + "|" + global.sm2Key.publicKey,
			global.sm2Key.privateKey,{hash:true,der:true});
	localStorage.setItem("persisArg", JSON.stringify(request));
	global.wssocket.send(JSON.stringify(request));
};

var executeContract = function() {
	var request = {};
	request.action = "executeContract";
	request.requestID = new Date().getTime() + "";
	request.contractID = global.contractInstance;
	var operation = $("#selectContractFunction")[0].value;
	if (operation == " " && operation == undefined) {
		myToast("执行合约", "请选择合约方法！");
		return;
	}
	request.operation = operation;
	request.arg =  	 $("#arg")[0].value ;
	request.pubkey = global.sm2Key.publicKey;
	console.log(request.arg);
 	request.signature = sm2.doSignature(request.contractID + "|" + operation
			+ "|" + $("#arg")[0].value + "|" + global.sm2Key.publicKey,
			global.sm2Key.privateKey,{hash:true,der:true});
	localStorage.setItem("persisArg", JSON.stringify(request));
	global.wssocket.send(JSON.stringify(request));
};

var onExecuteResult = function(obj) {
	console.log("onExecuteResult obj.data", obj.data);
	try {
		var result = obj;
		var styleTail = "<br>字符串格式";
		$("#responseStatus").html("执行状态:" + result.status);
		if (result.analysis != undefined) {
			$("#responseArea")[0].value = "执行结果:" + result.result + "\n动态分析结果:"
					+ result.analysis;
		} else {
		    if (result.result instanceof Object){
   			    $("#responseArea")[0].value = JSON.stringify(result.result);
   			    styleTail = "<br>JSON格式";
		    }  else
			    $("#responseArea")[0].value = result.result;
		}
		$("#responseID").html("请求ID:" + obj.responseID);
		$("#responseTime").html("响应时间:" + obj.executeTime + ("ms")+styleTail);
	} catch (e) {
		$("#responseStatus").html("执行状态:Fail");
		$("#responseArea")[0].value = obj.data;
		$("#responseID").html("请求ID:" + obj.responseID);
		$("#responseTime").html("响应时间:" + obj.executeTime + ("ms"));
	}
};


 var onHashResult = function(obj) { $("#hashResult").html("数链指纹:" + obj.data); };


var drawCPTable = function(table) {
    console.log("drawCPTable");
    global.contractprocess = table.data;
	if ($("#ciTabDiv").css("height") == "0px") {
		console.log("drawciTabDiv: ignore");
		return;
	}
	var dtLang = {
		"sProcessing" : "处理中...",
		"lengthMenu" : '显示 <select>' + '<option value="10">10</option>'
				+ '<option value="50">50</option>'
				+ '<option value="100">100</option>'
				+ '<option value="-1">全部</option>' + '</select> 项结果',
		"sZeroRecords" : "没有匹配结果",
		"sInfo" : "显示第 _START_ 至 _END_ 项结果，共 _TOTAL_ 项",
		"sInfoEmpty" : "显示第 0 至 0 项结果，共 0 项",
		"sInfoFiltered" : "(由 _MAX_ 项结果过滤)",
		"sInfoPostFix" : "",
		"sSearch" : "搜索:",
		"sUrl" : "",
		"sEmptyTable" : "表中数据为空",
		"sLoadingRecords" : "载入中...",
		"sInfoThousands" : ",",
		"oPaginate" : {
			"sFirst" : "首页",
			"sPrevious" : "上页",
			"sNext" : "下页",
			"sLast" : "末页"
		},
		"oAria" : {
			"sSortAscending" : ": 以升序排列此列",
			"sSortDescending" : ": 以降序排列此列"
		}
	};
	var tableHead = "<table id='cpTabDivTab' class='table display row-border'><thead><tr><th>序号</th><th>PID</th><th>是否泄漏</th><th>启动时间</th><th>CPUUser</th><th>CPUSyss</th><th>resident</th><th>memory</th><th>管理</th></tr></thead><tbody>";
	var tableTail = "</tbody></table>";
    table = table.data;
	console.log("drawciTable");
	var html = tableHead;
	for (var i = 0; i < table.length; i++) {
		html += "<tr><td>";
		html += (i + 1);
		html += "</td> <td>";
		html += table[i].pid;
		html += "</td> <td>";
	    html += table[i].isLeak;
        html += "</td> <td>";
		html += new Date(table[i].cpuStart).toLocaleString();
		html += "</td> <td>";
		html += table[i].cpuTotal;
		html += "</td> <td>";
		html += table[i].cpuSys;
		html += "</td> <td>";
		html += ((table[i].resident)/(1024*1024)).toFixed(2)+"MB";
		html += "</td><td>";
		html += ((table[i].memsize)/(1024*1024)).toFixed(2)+"MB";
		html += "</td> <td style='padding:2px 12px 2px 12px'>";
		html +="<button onclick='stopContractByPID(\""+table[i].pid+"\")' class='btn btn-secondary'>"+"停止</button>"
		//table[i].resultCheck;
		// html += "</td> <td>";
		// html += "<button class='btn btn-outline-secondary' type='button'
		// onclick='viewContractInstance("+ table[i].contractID +
		// ")'>更多</button>";
		html += "</td> </tr>";
	}
	html += tableTail;
	html = "<h5 class='card-title'>合约进程列表</h5>"+html;
	$("#cpTabDiv").html(html);

	$("#cpTabDivTab").DataTable(
			{
				"language" : dtLang,
				"rowCallback" : function(row, data, displayNum, displayIndex,
						dataIndex) {

				},
				"headerCallback" : function(thead, data, start, end, display) {
					$(thead).css("background", primaryColor);
					$(thead).css("color", "white");
					$(thead).children().css("background", primaryColor);
					$(thead).children().css("color", "white");
				},
				scrollCollapse : false,
				paging : true,
				pageLength : 10,
				order : [ [ 0, 'desc' ] ],
				"columnDefs" : [
				    {
                        "targets" : 1,
                        "render" : function(data, type, row, meta) {
                            if (data.length > 10)
//                                return "<span title='" + data + "'>"
//                                        + data.substring(0, 10)
//                                        + "  ...</span>";
                                return data;
                            else
                                return data;
                        }

                    },]
			});
};
var stopContractByPID = function(pid){
    $("#dialogBodyDiv").html("是否停止PID:"+pid);
    showDialog("请确认",function(){
        var request = {};
       	request.action = "killProcessByPID";
       	request.pid = pid;
        global.wssocket.send(JSON.stringify(request));
        var request2 = {};
        request2.action = "listLeakContractProcess";
        global.wssocket.send(JSON.stringify(request2));
    });
};