package com.saga.thread.common;

import java.util.ArrayList;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Iterator;
import java.util.List;
//import java.util.Map;
//import java.util.Map.Entry;

import org.zillion.util.log.LogUtil;

import com.saga.entity.Record;
import com.saga.util.Constant;
import com.saga.util.HBaseUtil;
import com.zillion.database.agent.ZillionAgent;

public class WTDBThread extends Thread {
	ZillionAgent agent;
	long realCheck = 0;
	// private String ip = null;
	private List<Record> wtdbrecordList = new ArrayList<Record>();
	// private Map<String, String> nodeStatus = new HashMap<String, String>();
	// private Map<String, String> pointStatus = new HashMap<String, String>();

	public WTDBThread(ZillionAgent agent) {
		try {
			this.agent = agent;
			// try {
			// this.ip = Constant.getLocalHostLANAddress().getHostAddress() +
			// ":" + Constant.TypePort.get("Down");
			// } catch (Exception e) {
			// // TODO Auto-generated catch block
			// this.ip = "0.0.0.0" + ":" + Constant.TypePort.get("Down");
			// e.printStackTrace();
			// }
		} catch (Exception e) {
			// TODO Auto-generated catch block
			LogUtil.error("WTDBThread.Exception: " + e.toString());
			System.exit(0);
		}
	}

	public void run() {
		LogUtil.info("WTDBThread-" + this.getName() + " Starting ...");

		while (true) {
			try {
				// LogUtil.info("WTDBThread-" + this.getName() + " Circling
				// ...");
				// this.realCheck();
				synchronized (Constant.RecordListToDB) {
					if (Constant.RecordListToDB.size() > 0) {
						// LogUtil.info(
						// this.getName() + " Constant.RecordListToDB.size(): "
						// + Constant.RecordListToDB.size());
						wtdbrecordList.addAll(Constant.RecordListToDB);
						LogUtil.info("Constant.RecordListToDB remove " + wtdbrecordList.size());
						Constant.RecordListToDB = new ArrayList<Record>();

						// LogUtil.info(
						// this.getName() + " Constant.RecordListToDB.size(): "
						// + Constant.RecordListToDB.size());
					}
				}
				if (wtdbrecordList.size() > 0) {
					String b = wtdbrecordList.get(0).buildingSign;
					if (Constant.BuildingConv.containsKey(b)) {
						b = Constant.BuildingConv.get(b);
					}
					HBaseUtil.BatchInsert(this.agent, Constant.BuildingDB.get(b), wtdbrecordList);
					// LogUtil.info(this.getName() + " recordList size: " +
					// recordList.size());
					// LogUtil.info(this.getName() + " HBaseUtil.BatchInsert
					// size: " + recordList.size());
					wtdbrecordList = new ArrayList<Record>();
					// LogUtil.info(this.getName() + " recordList size: " +
					// recordList.size());
				}
				Thread.sleep(3L);
				// Thread.sleep(Constant.Millisecond.SECOND_1);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				LogUtil.error("WTDBThread.run.Exception: " + e.toString());
			}
		}
	}

	// private void insertCollectorCommunicationLog(String building, String mac)
	// {
	// // TODO Auto-generated method stub
	// try {
	// HBaseUtil.InsertCollectorCommunicationLog(Constant.agent,
	// Constant.BuildingDB.get(building), building,
	// this.ip, mac, Constant.format(new Date()), "heart");
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// LogUtil.error("CollectThread.insertCollectorCommunicationLog.Exception: "
	// + e.toString());
	// }
	// }

	// private void realCheck() {
	// // TODO Auto-generated method stub
	//
	// if (System.currentTimeMillis() - this.realCheck >
	// Constant.Millisecond.SECOND_3) {
	// this.realCheck = System.currentTimeMillis();
	//
	// try {
	// // CollectorStatus
	// // LogUtil.info("Constant.nodeList:" + Constant.nodeList);
	// for (Entry<String, Long> node : Constant.nodeList.entrySet()) {
	// try {
	// String building = node.getKey().split("-")[0];
	// String mac = node.getKey().split("-")[1];
	// String status = "";
	// if (node.getValue() != null
	// && this.realCheck - node.getValue() < Constant.Millisecond.MINUTE_1) {
	// HBaseUtil.InsertCollectorStatus(Constant.agent,
	// Constant.BuildingDB.get(building), building,
	// this.ip, mac, "conn", Constant.format(new Date(node.getValue())));
	// status = "conn";
	// } else {
	// HBaseUtil.InsertCollectorStatus(Constant.agent,
	// Constant.BuildingDB.get(building), building,
	// this.ip, mac, "disconn", Constant.format(new Date(node.getValue())));
	// status = "disconn";
	// }
	//
	// if ((!this.nodeStatus.containsKey(node.getKey()))
	// || (!status.equalsIgnoreCase(this.nodeStatus.get(node.getKey())))) {
	// // 添加Log记录
	// HBaseUtil.InsertCollectorCommunicationLog(Constant.agent,
	// Constant.BuildingDB.get(building),
	// building, this.ip, mac, Constant.format(new Date(node.getValue())),
	// (status));
	// }
	// // 更新Status
	// this.nodeStatus.put(node.getKey(), status);
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// LogUtil.error("WTDBThread.realCheck.CollectorStatus.Exception: " +
	// e.toString());
	// }
	// }
	// // PointStatus
	// // up
	// // LogUtil.info("Constant.pointListUp:" + Constant.pointListUp);
	// // synchronized (Constant.pointListUp) {
	// // if (Constant.pointListUp.size() > 0) {
	//
	// // Iterator<Entry<String, Long>> pu =
	// // Constant.pointListUp.entrySet().iterator();
	// Map<String, Long> pu = new HashMap<String, Long>();
	// synchronized (Constant.pointListUp) {
	// if (Constant.pointListUp.size() > 0) {
	// pu.putAll(Constant.pointListUp);
	// }
	// }
	// for (Entry<String, Long> pointUp : pu.entrySet()) {
	// try {
	// String building = pointUp.getKey().split("-")[0];
	// String mac = pointUp.getKey().split("-")[1];
	// String point = pointUp.getKey().split("-")[2];
	// // System.out.println(point);
	// String meter = point.split("\\.")[0];
	// String funcid = point.split("\\.")[1];
	// // System.out.println(meter);
	// // System.out.println(funcid);
	// String status = "";
	//
	// if (pointUp.getValue() != null
	// && this.realCheck - pointUp.getValue() < Constant.Millisecond.MINUTE_10)
	// {
	// HBaseUtil.InsertPointStatus(Constant.agent,
	// Constant.BuildingDB.get(building), building,
	// this.ip, mac, meter, funcid, "up", "conn",
	// Constant.format(new Date(pointUp.getValue())), "");
	// status = "conn";
	// } else {
	// if (pointUp.getValue() != null) {
	// HBaseUtil.InsertPointStatus(Constant.agent,
	// Constant.BuildingDB.get(building), building,
	// this.ip, mac, meter, funcid, "up", "disconn",
	// Constant.format(new Date(pointUp.getValue())), "");
	// status = "disconn";
	// }
	// }
	// if ((!this.pointStatus.containsKey(pointUp.getKey()))
	// || (!status.equalsIgnoreCase(this.pointStatus.get(pointUp.getKey())))) {
	// // 添加Log记录
	// if (Constant.RecordAddress.containsKey(building + "-" +
	// point.replace(".", "-"))) {
	// int address = Constant.RecordAddress.get(building + "-" +
	// point.replace(".", "-"));
	// if (pointUp.getValue() != null) {
	// HBaseUtil.InsertPointCommunicationLog(Constant.agent,
	// Constant.BuildingDB.get(building), building, this.ip, mac, meter, funcid,
	// "up", (status), Constant.RecordList.get(address).seq,
	// Constant.format(new Date(pointUp.getValue())), "");
	// }
	// }
	//
	// }
	// // 更新Status
	// this.pointStatus.put(pointUp.getKey(), status);
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// LogUtil.error("WTDBThread.realCheck.PointStatus.up.Exception:" +
	// e.toString());
	// }
	// }
	//
	// // while (pu.hasNext()) {
	// // try {
	// // Entry<String, Long> pointUp = pu.next();
	// // String building = pointUp.getKey().split("-")[0];
	// // String mac = pointUp.getKey().split("-")[1];
	// // String point = pointUp.getKey().split("-")[2];
	// // // System.out.println(point);
	// // String meter = point.split("\\.")[0];
	// // String funcid = point.split("\\.")[1];
	// // // System.out.println(meter);
	// // // System.out.println(funcid);
	// // String status = "";
	// //
	// // if (pointUp.getValue() != null
	// // && this.realCheck - pointUp.getValue() <
	// // Constant.Millisecond.MINUTE_10) {
	// // HBaseUtil.InsertPointStatus(Constant.agent,
	// // Constant.BuildingDB.get(building), building,
	// // this.ip, mac, meter, funcid, "up", "conn",
	// // Constant.format(new Date(pointUp.getValue())), "");
	// // status = "conn";
	// // } else {
	// // if (pointUp.getValue() != null) {
	// // HBaseUtil.InsertPointStatus(Constant.agent,
	// // Constant.BuildingDB.get(building), building,
	// // this.ip, mac, meter, funcid, "up", "disconn",
	// // Constant.format(new Date(pointUp.getValue())), "");
	// // status = "disconn";
	// // }
	// // }
	// // if ((!this.pointStatus.containsKey(pointUp.getKey()))
	// // ||
	// // (!status.equalsIgnoreCase(this.pointStatus.get(pointUp.getKey()))))
	// // {
	// // // 添加Log记录
	// // if (Constant.RecordAddress.containsKey(building + "-" +
	// // point.replace(".", "-"))) {
	// // int address = Constant.RecordAddress.get(building + "-" +
	// // point.replace(".", "-"));
	// // HBaseUtil.InsertPointCommunicationLog(Constant.agent,
	// // Constant.BuildingDB.get(building),
	// // building, this.ip, mac, meter, funcid, "up", (status),
	// // Constant.RecordList.get(address).seq,
	// // Constant.format(new Date(pointUp.getValue())), "");
	// // }
	// //
	// // }
	// // // 更新Status
	// // this.pointStatus.put(pointUp.getKey(), status);
	// // } catch (Exception e) {
	// // // TODO Auto-generated catch block
	// // e.printStackTrace();
	// // LogUtil.error("WTDBThread.realCheck.PointStatus.up.Exception:"
	// // + e.toString());
	// // }
	// //
	// // }
	// // }
	// // }
	// // down
	//
	// try {
	// List<String> nk = new ArrayList<String>();
	// List<String> ps = new ArrayList<String>();
	// synchronized (Constant.id2time) {
	// Iterator<Entry<String, Long>> it =
	// Constant.id2time.entrySet().iterator();
	// while (it.hasNext()) {
	// try {
	// Entry<String, Long> n = it.next();
	// String building = Constant.id2point.get(n.getKey()).split("-")[0];
	// String mac = Constant.id2point.get(n.getKey()).split("-")[1];
	// String point = Constant.id2point.get(n.getKey()).split("-")[2];
	// String meter = point.split("\\.")[0];
	// String funcid = point.split("\\.")[1];
	// // String function =
	// // Constant.id2function.get(n.getKey());
	//
	// if (n.getValue() != null
	// && System.currentTimeMillis() - n.getValue() >
	// Constant.Millisecond.SECOND_10) {
	// try {
	// if ("finish:finish:success"
	// .equalsIgnoreCase(Constant.id2status.get(n.getKey()))) {
	// // HBaseUtil.InsertPointStatus(Constant.agent,
	// // Constant.BuildingDB.get(building),
	// // building, this.ip, mac, meter,
	// // funcid, "down", "conn",
	// // // function + ":" +
	// // Constant.format(new
	// // Date(Constant.id2time.get(n.getKey()))),
	// // Constant.id2status.get(n.getKey()));
	// ps.add(Constant.BuildingDB.get(building) + ";" + building + ";" + this.ip
	// + ";" + mac + ";" + meter + ";" + funcid + ";" + "down" + ";"
	// + "conn" + ";"
	// + Constant.format(new Date(Constant.id2time.get(n.getKey()))) + ";"
	// + Constant.id2status.get(n.getKey()));
	// } else {
	// // Constant.pointListDown.put(n.getKey(),
	// // null);
	// // HBaseUtil.InsertPointStatus(Constant.agent,
	// // Constant.BuildingDB.get(building),
	// // building, this.ip, mac, meter,
	// // funcid, "down", "disconn",
	// // // function + ":" +
	// // Constant.format(new
	// // Date(Constant.id2time.get(n.getKey()))),
	// // Constant.id2status.get(n.getKey()));
	// ps.add(Constant.BuildingDB.get(building) + ";" + building + ";" + this.ip
	// + ";" + mac + ";" + meter + ";" + funcid + ";" + "down" + ";"
	// + "disconn" + ";"
	// + Constant.format(new Date(Constant.id2time.get(n.getKey()))) + ";"
	// + Constant.id2status.get(n.getKey()));
	// }
	//
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// nk.add(n.getKey());
	// it.remove();
	// }
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// }
	//
	// synchronized (Constant.id2point) {
	// for (String k : nk) {
	// if (Constant.id2point.containsKey(k)) {
	// Constant.id2point.remove(k);
	// }
	// }
	// }
	// synchronized (Constant.id2status) {
	// for (String k : nk) {
	// if (Constant.id2status.containsKey(k)) {
	// Constant.id2status.remove(k);
	// }
	// }
	// }
	// synchronized (Constant.id2function) {
	// for (String k : nk) {
	// if (Constant.id2function.containsKey(k)) {
	// Constant.id2function.remove(k);
	// }
	// }
	// }
	//
	// nk = new ArrayList<String>();
	// for (String s : ps) {
	// String[] a = s.split(";");
	// HBaseUtil.InsertPointStatus(Constant.agent, a[0], a[1], a[2], a[3], a[4],
	// a[5], a[6], a[7],
	// a[8], a[9]);
	// Thread.sleep(1L);
	// }
	// ps = new ArrayList<String>();
	//
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// LogUtil.error("WTDBThread.realCheck.PointStatus.down.Exception:" +
	// e.toString());
	// }
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// LogUtil.error("WTDBThread.realCheck.Exception: " + e.toString());
	// }
	// }
	// }

}
