package com.cab.controller;

import java.awt.Color;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.cab.controller.CaptchaFactory.CaptchaFactory;
import com.cab.service.ValidationCodeServiceImpl;
import com.cku.config.Global;
import com.cku.core.RESTResponse;
import com.cku.core.ZAErrorCode;
import com.cku.core.ZAException;
import com.cku.patchca.color.SingleColorFactory;
import com.cku.patchca.filter.predefined.CurvesRippleFilterFactory;
import com.cku.patchca.service.ConfigurableCaptchaService;
import com.cku.service.IpAddressServiceImpl;
import com.cku.sms.ZtSmsUtil;
import com.cku.util.Debugger;
import com.cku.util.ServletUtils;
import com.sys.util.CacheUtils;
import com.sys.util.IPLimitUtil;
import com.wf.captcha.base.Captcha;
import com.wf.captcha.utils.CaptchaUtil;

@Controller
@RequestMapping(value = "utils")
public class ValidationCodeController {

	
	@Autowired
	public ValidationCodeServiceImpl validationService;
	@Autowired
	private IPLimitUtil IPLimitUtil;
	
//	private String captchaArray [] = { "png","gif","arithmetic","chineseGif"};
	
	private String captchaArray [] = {"gif"};
	
	@Autowired
	private IpAddressServiceImpl ipAddressService;
	
	@Autowired
	private CacheUtils cacheUtils;
	
	@RequestMapping(value = "/sendNoteYX")
	public void x() {
//		sendNoteYX
		String notification = "您于" + new SimpleDateFormat("yyyy年MM月dd日  HH时mm分").format(new Date()) 
        		+ "已取消了订单号为:" + "123" + "的订单。如非您本人操作，请尽快登录CKU会员中心进行重新报名，以免耽误您的参赛安排。";
		ZtSmsUtil.sendNoteYX(notification, "15652388352");
	}
	
	@RequestMapping(value = "/apply-code")
	public void api_apply(HttpServletResponse response, HttpServletRequest request) throws IOException
	{
		RESTResponse result = new RESTResponse();
		try
		{
			
			String ip = IPLimitUtil.getIpAddr(request);
			// 添加到ipAddressS
			ipAddressService.addIpAddress(ip);
			// 验证ip是否在黑名单
			if(ipAddressService.isBlackList(ip)) {
				throw new ZAException(-1, "该ip已列为黑名单，请联系客服，致电400-660-7000");
			}
			String phone = ServletUtils.getParameter(request, "phone");
			
			String uses = ServletUtils.getParameter(request, "register",null);
			String code = ServletUtils.getParameter(request, "validateCode");
			Debugger.doAssert(StringUtils.isNotBlank(code), ZAErrorCode.ZA_ERC_UNKNOWN, "请输入验证码");
			HttpSession session = request.getSession();
			String validateCode = session.getAttribute("validateCode").toString();
			Debugger.doAssert(StringUtils.isNotBlank(validateCode), ZAErrorCode.ZA_ERC_UNKNOWN, "验证码无效，请从新获取验证码");
			Debugger.doAssert(validateCode.equals(code), ZAErrorCode.ZA_ERC_UNKNOWN, "验证码有误");
			session.setAttribute("validateCode",null);
			// 相同的ip，一天调用10次
			IPLimitUtil.CheckLimit("register", request, 10);
			validationService.applyNewCode(phone,uses);
			
			result = new RESTResponse();
		}
		catch (ZAException e)
		{
			result = new RESTResponse(e.get_code(),e.getMessage());
		}
		
		ServletUtils.writeResponse(response, result);
	}

	@RequestMapping(value = "/apply-code-new")
	public void api_apply_new(HttpServletResponse response, HttpServletRequest request) throws IOException {
		RESTResponse result = new RESTResponse();
		try {
			String ip = IPLimitUtil.getIpAddr(request);
			// 添加到ipAddress
			ipAddressService.addIpAddress(ip);
			// 验证ip是否在黑名单
			if(ipAddressService.isBlackList(ip)) {
				throw new ZAException(-1, "该ip已列为黑名单，请联系客服，致电400-660-7000");
			}
			String phone = ServletUtils.getParameter(request, "phone");
			String uses = ServletUtils.getParameter(request, "register", null);
			String code = ServletUtils.getParameter(request, "validateCode");
			
			Debugger.doAssert(StringUtils.isNotBlank(code), ZAErrorCode.ZA_ERC_UNKNOWN, "请输入验证码");
			String deviceCode = ServletUtils.getParameter(request, "deviceCode");
			Debugger.doAssert(StringUtils.isNotBlank(deviceCode), ZAErrorCode.ZA_ERC_UNKNOWN, "参数错误");
			String validateCode = (String) cacheUtils.get(deviceCode);
			
			Debugger.doAssert(StringUtils.isNotBlank(validateCode), ZAErrorCode.ZA_ERC_UNKNOWN, "验证码无效，请从新获取验证码");
			if(Global.isDevMode()) {
				Debugger.doAssert(validateCode.equals(code) || "6666".equals(code), ZAErrorCode.ZA_ERC_UNKNOWN, "验证码有误");
			}else {
				Debugger.doAssert(validateCode.equals(code), ZAErrorCode.ZA_ERC_UNKNOWN, "验证码有误");
			}
			// 相同的ip，一天调用10次
			IPLimitUtil.CheckLimit("register", request, 10);
			validationService.applyNewCode(phone, uses);
			cacheUtils.remove(deviceCode);
			result = new RESTResponse();
		} catch (ZAException e) {
			result = new RESTResponse(e.get_code(), e.getMessage());
		}

		ServletUtils.writeResponse(response, result);
	}
	
	@RequestMapping(value = "/getCode")
	public void getCode(HttpServletResponse response, HttpServletRequest request) throws IOException {
		RESTResponse result = new RESTResponse();
		try {
			String phone = ServletUtils.getParameter(request, "phone");

			String code = validationService.aa(phone);

			result = new RESTResponse("msg", code);
		} catch (Exception e) {
			result = new RESTResponse(e);
		}

		ServletUtils.writeResponse(response, result);
	}

	
	@RequestMapping(value = "/validateCode")
	public void validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception{
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/jpeg");
		
		ConfigurableCaptchaService cs = new ConfigurableCaptchaService();
		cs.setColorFactory(new SingleColorFactory(new Color(25, 60, 170)));
		cs.setFilterFactory(new CurvesRippleFilterFactory(cs.getColorFactory()));
		
		com.cku.patchca.service.Captcha captcha = cs.getCaptcha();
		HttpSession session = request.getSession();
		session.setAttribute("validateCode",captcha.getChallenge());
		
		ImageIO.write(captcha.getImage(),"png", response.getOutputStream()); 
	}
	
	
	@RequestMapping(value = "/validateCodeGif")
	public void validateCodeGif(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String deviceCode = ServletUtils.getParameter(request, "deviceCode");
		Debugger.doAssert(StringUtils.isNotBlank(deviceCode), ZAErrorCode.ZA_ERC_UNKNOWN, "缺少必要参数");
		CaptchaFactory captchaFactory = new CaptchaFactory();
		Captcha captcha = captchaFactory.getCaptcha(getCaptchaString());
		captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
		captcha.setFont(Captcha.FONT_9);	
		cacheUtils.put(deviceCode, captcha.text().toLowerCase());
		CaptchaUtil.out(captcha, request, response);
	}
	
	private String getCaptchaString() {
		int random = new Random().nextInt(captchaArray.length);
		return captchaArray[random];
	}
}
