/**
 * com.lvye.msg<br>
 * ļSmsReceiveThread.java<br>
 * ߣtowenc@gmail.com<br>
 * ʱ䣺200910:46:45<br>
 * 
 * Current revision $Revision:Revision$<br>
 * Latest change by $Author:Author$<br>
 * $Log:$ <br>
 */

package com.lvye.msg;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import mobset.smsSDK;
import mobset.str_RecvMsg;
import mobset.str_SendMsg;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author wenc
 * 
 */
public class SmsReceiveThread extends Thread {
	static Log log = LogFactory.getLog(SmsReceiveThread.class);
	static private SimpleDateFormat formatday = new SimpleDateFormat("dd");
	private static String postUrl = "http://test";
	private static String Exceptip = "æ,Ժ!";

	private smsSDK sdk = new smsSDK();
	boolean stop = false;
	private boolean blnNoticeMobile=false;

	public void run() {
		log.info("SmsReceiveThread빤...");
		
		connectSms();
		while (!getStopFlag()) {
			try {
				if (receiveSms() > 0) {
					Thread.sleep(100);
				} else {
					int hour=Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
					if ( Calendar.getInstance().get(Calendar.HOUR_OF_DAY)==9 || hour ==17){
						if (!blnNoticeMobile){
							blnNoticeMobile =true;
							sendSms("mobilephone","Ž.");
						}
					}else{
						blnNoticeMobile =false;						
					}
					Thread.sleep(10 * 1000);
				}
			} catch (Exception e) {
				log.error(e);
			}
		}
		disConnectSms();
		
		log.info("SmsReceiveThreadŽֹͣ");
	}

	/**
	 * ӶŷӲʱÿ30һ
	 * 
	 * @author wenc
	 */
	private void connectSms() {
		log.info("SmsReceiveThreadŽտʼ");
		// ʱҵID,û,
		int iRet = -1;
		while (iRet != 0 && !getStopFlag()) {
			iRet = sdk.Sms_Connect("www.mobset.com", 110414, "username",
					"pass", 30);
			if (iRet == 0)// ¼ɹ
			{
				log.info("ӷɹ...");
				return;
			} else {
				log.info("ӷʧܣ:" + iRet);
			}
			try {
				Thread.sleep(30000);
			} catch (InterruptedException e) {
				log.debug(e);
			}
		}
	}

	/**
	 * @return նţضŵδն 0ʾֻһϢǵǰյ -1ʾûδܵϢ
	 *         0ʾжȴյĶţ
	 * @author wenc
	 */
	private int receiveSms() {
		str_RecvMsg recvMsg = new str_RecvMsg();
		int iRet = sdk.Sms_Get(recvMsg); // ⿴ûнյ
		// нյ
		if (iRet >= 0) {
			log.debug("ֻţ" + recvMsg.strSendNum);
			log.debug("ݣ" + recvMsg.strMsg);		
			processMsg(recvMsg.strSendNum, recvMsg.strMsg,recvMsg.dRecvTime);
		}
		log.debug("" + iRet);
		return iRet;
	}

	/**
	 * ֻ·
	 * 
	 * @param mobile
	 * @param msg
	 * @author wenc
	 */
	private void sendSms(String mobile, String msg) {
		str_SendMsg[] sendMsg = new str_SendMsg[1];
		sendMsg[0] = new str_SendMsg();
		sendMsg[0].strMobile = mobile; // Ŀֻ룬ʱĺ롣
		sendMsg[0].strMsg = msg; // 
		int iRet = sdk.Sms_Send(sendMsg, 1);
		if (iRet <= 0) {
			log.warn("ŷʧ:" + mobile + ":" + iRet +" :" + msg);
		} else {
			log.info("ŷͳɹ:" + mobile + " :" + msg);

		}
	}

	/**
	 * ֶŰ ݸʽ ʽЧʱ͵ƽ̨ӿڣֱӷûʾϢ
	 * ϵͳյŵʱ ͬܵʱ䲻ͬһ죬ִͶҲظ
	 * @param mobile
	 * @param msg
	 * @author wenc
	 */
	private void processMsg(String mobile, String msg, Date receiveDate) {
		//ͬһ
		String now=formatday.format(new Date());
		String receive=formatday.format(receiveDate);
		if (!now.equals(receive)){
			log.info("ͬһ:" + now + ":" + receive + ":" + mobile + ":" + msg);
			return;
		}
//		String str = "123456789#123456142729198085623245#";
		String str = msg.replace("", "#");
		String[] arr = str.split("#");
		if (arr.length != 4) {
			log.debug("ЧĶŸʽݣ" + mobile + ":" + msg);
			sendSms(mobile, "ЧĶŸʽ.");
			return;
		}

		String md5str = "";
		for (int i = 0; i < 4; i++) {
			arr[i] = arr[i].trim();
			md5str = md5str + arr[i];
		}
		HttpClient client = new HttpClient();
		client.getHttpConnectionManager().getParams().setConnectionTimeout(
				30000);
		PostMethod method = new UTF8PostMethod(postUrl);
		try {
			// ò
			method.setParameter("cardNo", arr[0]);
			method.setParameter("cardPass", arr[1]);
			method.setParameter("insureIdNo", arr[2]);
			method.setParameter("insureName", arr[3]);
			method.setParameter("encryvar", Md5Encrypt.md5(md5str + "LVY"));
			int statusCode = client.executeMethod(method);
			// ÷ؽ
			String s = method.getResponseBodyAsString();
			if (statusCode == 200) {
				sendSms(mobile, s);
			} else {
				log.warn("htmlstate: " + mobile + ":" + statusCode);
				sendSms(mobile, Exceptip);
			}
		} catch (Exception e) {
			log.error("Ŵ:" + mobile, e);
			sendSms(mobile, Exceptip);
		} finally {
			method.releaseConnection();
		}

	}

	private void disConnectSms() {
		sdk.Sms_DisConnect(); // Ͽ
		sdk = null;
	}

	public synchronized void stopthread() {
		stop = true;
	}

	public synchronized boolean getStopFlag() {
		return stop;
	}

	public static class UTF8PostMethod extends PostMethod {
		public UTF8PostMethod(String url) {
			super(url);
		}

		public String getRequestCharSet() {
			return "UTF-8";
		}
	}

		
	public static void main(String[] avgs) {
		(new SmsReceiveThread()).start();
		log.info("main .");
	}
}
