package com.nms.server.thread.monitor;

import java.io.IOException;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Date;

import org.apache.log4j.Logger;

import com.nms.server.bean.DetectInfo;
import com.nms.server.bean.SetInfo;
import com.nms.server.common.Common;
import com.nms.server.common.Constants;
import com.nms.server.thread.monitor.util.MonitorUtil;
import com.nms.server.thread.socket.SocketCMD;
import com.nms.server.util.DateUtil;
import com.nms.server.util.socket.SocketUtils;

/**
 * 监测NC系统时间监测类别执行线程
 *  发送通信获取NC系统时间，比较当前DC系统时间比较，并判断告警
 *  @date Jun 4, 2013 9:49:01 AM
 *	@author ZhangGang
 *
 */
public class SystemDateThread extends SocketUtils implements  Runnable{
	private Logger logger = Logger.getLogger(SystemDateThread.class);
	private String name;
	private SetInfo info;
	private Long startTime = null;

	/**
	 * @param name	线程名称
	 * @param ip	节点IP
	 * @param port	端口
	 * @param info	监测设置信息
	 * @param startTime	该检测启动时间
	 */
	public SystemDateThread(String name,String ip,int port,SetInfo info,Long startTime) {
		super(ip, port);
		this.name = name;
		this.info = info;
		this.startTime = startTime;
	}
	

	/**
	 * 发送通讯获取NC系统时间监测设置模块开发
	 * 功能实现分为两部分：
	 * 第一部分、通讯获取信息：系统时间
	 * 第二部分、整理监测结果数据
	 */
	public void run() {
		
		Thread.currentThread().setName(name+" "+ip);
		Long sitInfoId = info.getId();//监测设置id
		Long maxTimes = info.getCheckMaxTimes();//监测设置最大尝试次数
		Long checkTime = System.currentTimeMillis();
		String processIden = info.getProcessIden();
		
		try {

			int a = 0;
			DetectInfo  detectInfo = null;
			//-- 尝试次数范围内发送通信获取NC系统时间
			loop:
				for(; a < maxTimes ;){
					detectInfo = this.getSystemDateBysocket();
					a++;
					if(detectInfo != null){	//成功,如果第一次就成功的话，那么尝试次数为1
						break loop;
					}else{	//失败
						continue loop;
					}
				}
			
			if(detectInfo == null){
				detectInfo = new DetectInfo();
//				detectInfo.setDescInfo("获取该节点系统时间失败");
//				detectInfo.setDescInfo("Getting the time failure of the node system");
				detectInfo.setDescInfo("i18n_server.SystemDateThread.getSysTimeFail_n81i");
			}
			detectInfo.setTestTimes(a);
			detectInfo.setCheckTime(checkTime);
			
			//-- 生成监测数据
			MonitorUtil.createMonitorData(ip, info, startTime, Common.getAlarmInfoMap().get(info.getId()+ ""), detectInfo);
		} catch (Exception ex) {
			logger.error("Getting the time anomaly of NC system",ex);
			String[] alarm = Common.alarmExceptionInfo(sitInfoId, ip, Constants.DETEC_SYSTEMDATE_STR, processIden, startTime, 1,Constants.DETECTION_INFO_ALARM_WRONG, ex.getMessage());
			Common.addAlarmData(alarm);
		}
	}
	
	
	/**
	 * 创建通讯获取NC系统时间
	 * 将成功信息整理到 DetectInfo 中并返回
	 * 失败返回 null
	 * @time Jun 4, 2013-10:34:41 AM
	 * @return
	 */
	private DetectInfo getSystemDateBysocket(){
		
		DetectInfo detectInfo = null;
		//set up a connection
		try {
			//-- 创建通讯
			this.createClientSocket();
			
			//-- 发送获取系统时间命令
			sendMessage(SocketCMD.REQ_CLIENT_SERVER_SYSTEMDATE);
			
			//-- 接收系统时间信息
			String msg = receiveMessage();
			logger.debug("服务器系统时间：" + msg);
			//-- 回复通讯完成标识
			this.sendMessage(SUCCESS);
			
			//-- systemdate 监测设置 详细数据整理
			long localDate = System.currentTimeMillis();// 服务器系统时间=DC本地时间
			long sysDate = Long.parseLong(msg);// 客户机系统时间=被监测机时间
			long timeDelay = Math.abs(getMinutesFromBeginToEnd(sysDate, localDate));
			
			//-- 信息保存到监测信息对象中
			detectInfo = new DetectInfo();
			detectInfo.getDetailDatas().add(localDate + MonitorUtil.SEPARATOR + sysDate + MonitorUtil.SEPARATOR + timeDelay);
			detectInfo.setDescInfo("server:"
					+ DateUtil.getStingDate(DateUtil.YYYY_MM_DD_HH24_MM_SS,new Date(localDate))
					+ " agent:" + DateUtil.getStingDate(DateUtil.YYYY_MM_DD_HH24_MM_SS,new Date(sysDate)));
			
		} catch (Exception e) {
			logger.error("Getting system time failure："+e.getMessage());
		}finally{
			close();
		}
		
		return detectInfo;
	}
	
	public static long getMinutesFromBeginToEnd(long begin, long end) {
		return (end - begin) / (60 * 1000);
	}
	
 	public static void main(String [] args) throws UnknownHostException, SocketException, IOException, InterruptedException {
//		MonitorManagerThread 
 		
// 		int a = 0;
//		DetectInfo  detectInfo = null;
//		//-- 尝试次数范围内发送通信获取NC系统时间
//		loop:
//			for(; a < 5 ;){
//				detectInfo = new DetectInfo();
//				a++;
//				if(detectInfo != null){	//成功
//					break loop;
//				}
//			}
//		
//		System.out.println(a);
	}
	
}
