package Func;

import java.util.Calendar;

import include.Command;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Variant;

public class XinNuo {
	private ActiveXComponent activeDm=null;
	private LanAnswer lanAnswer=null;
	
	public XinNuo(ActiveXComponent activeDm) {
		this.activeDm=activeDm;
		this.lanAnswer=new LanAnswer(this.activeDm);
		verifyXinNuo();
	}
	public XinNuo(){
		verifyXinNuo();
	}
	/**
	 * 校验信诺对象
	 * 首先检查是否创建了信诺对象,若是创建了则跳过,没创建则先创建
	 */
	public void verifyXinNuo(){
		int i=0;
		while(i++<10){
			try {
				Command.activeXinNuo.invoke("WaitOnline");	//检测繁忙程度,判断信诺对象是否创建
				i=100;	//退出循环
			} catch (Exception e) {
				Command.activeXinNuo=new ActiveXComponent("XinNuo.SendData");		//创建信诺自动答题对象,再次创建
			}
		}
		if(i<100){	//小于100,循环中并没有成功过
			new Func.File().log("加载自动答题失败!可尝试关闭软件后重新打开软件");
		}
	}
	
	/**
	 * 出现验证码后的操作-自动答题
	 */
	public void autoDaTi(){
		File file=new File(this.activeDm);
		Mouse mouse=new Mouse(this.activeDm);
		Sleep sleep=new Sleep();
		
		int result=0;	//验证码结果,23为2|3两个位置
		int datiSussess=0;	//答题是否成功,进行3次答题,++递增
		while(datiSussess++<4){
			//使用信诺答题初始化
			boolean useXN=!Command.useLanAnswer;	
			
			//若是开启了局域网答题,首先使用局域网的进行答题
			//判断当前时间是否在设定的局域网答题范围内
			Calendar Cld = Calendar.getInstance();
			int hours = Cld.get(Calendar.HOUR_OF_DAY);
			int minute = Cld.get(Calendar.MINUTE);
			if(Command.hoursStart<=hours&&hours<Command.hoursEnd){
				//进行局域网答题
				if(Command.useLanAnswer){
					int handle=this.lanAnswer.faqCapture(428,368,596,460);
					String ansAll=this.lanAnswer.faqSend(Command.serverIP, handle);
					System.out.println("Lan--->"+ansAll);
					String ansArray[]=ansAll.split(":");
					
					if(ansArray[0].indexOf("Error")>-1){
						//有Error,失败了,可能是服务端关闭了
						file.log("局域网答题-Error,转而开启信诺答题");
//						useXN=true;
					}else{
						//成功了
						result=new Lang().Integer_(ansArray[1], 9);
					}
					ansArray=null;
				}
			}else{
				useXN=true;
			}
			
			
			//使用信诺进行答题
			if(useXN){
				System.out.println("使用XN答题");
				String getTid="123";
				//首先截图,将验证码截图保存为check.bmp文件
				file.screenImage("check", 428,368,596,460);
				
				try {
					Variant[] var=new Variant[5];
					var[0]=new Variant(Command.autoDaTiPasswordString);
					var[1]=new Variant(2022);	//游戏ID
					var[2]=new Variant(Command.thisFilePath+"\\"+Command.screenNoteFile+"\\check.bmp");
					var[3]=new Variant(42);	//超时时间42秒
					var[4]=new Variant("bmp");
					getTid=Command.activeXinNuo.invoke("SendFile",var).getString();
					var=null;
				} catch (Exception e) {
					file.log("自动答题SendGif异常捕获:"+e.getMessage());
				}
				
				
				int i=0;	//限制循环次数
				while(result<1&&i++<20){
					try {
						result=Integer.parseInt(Command.activeXinNuo.invoke("GetAnswer",getTid).getString());
					} catch (Exception e) {
						file.log("获取答题答案GetAnswer转int时异常捕获:"+e.getMessage());
					}
					sleep.sleep(2000);	//2秒一次请求
				}
			}
			
			//局域网答题或者XN答题的结果进行检测
			if(10<result&&result<89){
				file.log("	`e`答题成功,返回值:"+result);
				datiSussess=100;		//退出循环				
			}else{
				file.log("自动答题失败!");
				//点击刷新键重新答题
				result=0;	//失败,初始化0
				mouse.mouseClick(504,480, true);
				sleep.sleep(8000);	//8秒,避免延迟
			}
		}
		
		if(result==0){
			file.log("答题最终失败!!");
			mouse.mouseClick(561,480, true);		//点击取消键,取消自动答题
			sleep.sleep(3000);
		}else{
			String resultString=result+"";
			
			//进行验证动作,点击
			autoDaTiAction(resultString.charAt(0));
			sleep.sleep(500);
			autoDaTiAction(resultString.charAt(1));
			sleep.sleep(500);
			mouse.mouseClick(446,481, true);	//点击确定
		}
		
		file=null;
		mouse=null;
		sleep=null;
	}
	
	/**
	 * 为autoDaTi服务
	 * 8个验证码根据传入1~8进行左键点击
	 */
	public void autoDaTiAction(char param){
		int key=1;
		Mouse mouse=new Mouse(activeDm);
		try {
			key=Integer.parseInt(param+"");
		} catch (Exception e) {
			new Func.File().log("自动答题-自动填写验证动作异常捕获:"+e.getMessage());
		}
		switch (key) {
		case 1:
			mouse.mouseClick(454,390, true);
			break;
		case 2:
			mouse.mouseClick(492,390, true);
			break;
		case 3:
			mouse.mouseClick(526,392, true);
			break;
		case 4:
			mouse.mouseClick(564,392, true);
			break;
		case 5:
			mouse.mouseClick(449,429, true);
			break;
		case 6:
			mouse.mouseClick(489,432, true);
			break;
		case 7:
			mouse.mouseClick(523,430, true);
			break;
		case 8:
			mouse.mouseClick(564,430, true);
			break;
		default:
			break;
		}
		
		mouse=null;
	}
	
	/**
	 * 信诺答题,返回剩余可使用次数
	 */
	public String getAutoDaTiNum(){
		String result="查询时程序出现异常!";
		try {
			Variant[] var=new Variant[1];
			var[0]=new Variant(Command.autoDaTiPasswordString);
			String getResult=Command.activeXinNuo.invoke("SNSearch",var).getString();
			var=null;
			if(getResult.equals("-1")){
				result="上传异常";
			}else if(getResult.equals("-2")){
				result="用户名或密码错误";
			}else if(getResult.equals("-3")){
				result="查询失败";
			}else{	//查询成功,返回剩余题分
				result=getResult+"<br/>(每次验证消耗14题分)";
			}
			getResult=null;
		} catch (Exception e) {
			new Func.File().log("查询自动答题剩余时异常捕获:"+e.getMessage());
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * DM局域网答题
	 */
	public void lanDaTi(){
		
	}
}