package com.cku.sms;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cku.config.Global;
import com.cku.util.MD5Generator;


/**
 * 短信发送功能模块
 *
 * fanhuibin 优化
 * @author yueyang
 */
public class ZtSmsUtil {
	private static Logger logger = LoggerFactory.getLogger(ZtSmsUtil.class);
	public static final String SMS_LEFT = "尊敬的会员，";
	private static final String SMS_RIGHT = "【宠爱王国】";
	private static final String SMS_UN_SUBSCRIBE = "拒收请回复R";

	private static final String sendUrl = "http://api.mix2.zthysms.com/v2/sendSms";
	private static final String usernameHY = "chongaihy";
	private static final String passwordHY = "136jr64H";
	private static final String usernameYX = "chongaiyx";
	private static final String passwordYX = "s12RE0tt";

	private static final int TYPE_HY = 1;
	private static final int TYPE_YX = 2;

	public static String getUrl(String param) {
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(sendUrl);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("content-type", "application/json");
			conn.setRequestProperty("user-agent",
					"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			//设置相应请求时间
			conn.setConnectTimeout(30000);
			//设置读取超时时间
			conn.setReadTimeout(30000);
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数
			out.print(param);
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream(),"utf-8"));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			e.printStackTrace();
//			System.out.println(e);
//			return "发送 POST 请求出现异常！";
		}
		//使用finally块来关闭输出流、输入流
		finally{
			try{
				if(out!=null){
					out.close();
				}
				if(in!=null){
					in.close();
				}
			}
			catch(IOException ex){
				ex.printStackTrace();
			}
		}
		logger.info("send sms result:{}",result);
		return result;
	}

	/**
	 * @Description： 发送通知类短信
	 * @author: yuanshuai
	 * @date: 2018/1/19 11:29
	 */
	public static String sendNote(String content, String mobile) {
		content = SMS_LEFT + content + SMS_RIGHT;
		String sendParam = buildSendParam(mobile, content, TYPE_HY);
		return StringUtils.isBlank(sendParam) ? null : getUrl(sendParam);
	}

	/**
	 * @Description： 发送营销类短信
	 * @author: yuanshuai
	 * @date: 2018/1/19 11:29
	 */
	public static String sendNoteYX(String content, String mobile) {
		content = content + SMS_UN_SUBSCRIBE + SMS_RIGHT;
		String sendParam = buildSendParam(mobile, content, TYPE_YX);
		return StringUtils.isBlank(sendParam) ? null : getUrl(sendParam);
	}

	/**
	 *
	 * @Description：注册宠爱王国账号使用的发送验证码方法
	 * @author: zhuoHeng
	 * @version: 2017年5月22日 上午11:01:50
	 */
	public static String sendVerificationCode(String content, String mobile, String type) {
		String sendParam = buildSendParam(mobile, SMS_LEFT + content, TYPE_HY);
		logger.info("ztsms param:{}",sendParam);
		return StringUtils.isBlank(sendParam) ? null : getUrl(sendParam);
	}

	/**
	 * @Description： 根据手机号和内容构建发送的url
	 * @author: yuanshuai
	 * @date: 2017/12/13 17:01
	 */
	private static String buildSendParam(String mobile, String content, int type) {
		logger.info("build send param mobile:{},content:{},type:{}",mobile,content,type);
		String param;

		//非正式环境无法发送短信
		if (Global.isDevMode()
				&& !mobile.equals("18515039553")// 刘慧敏
				&& !mobile.equals("18810669468")// 袁帅
				&& !mobile.equals("15811560827")// 朱云飞
				&& !mobile.equals("13911284656")// 甘甘
				&& !mobile.equals("15652191645")// 张君武
				&& !mobile.equals("15210500649")// 张向
				&& !mobile.equals("13651185032") // 林涛
				&& !mobile.equals("15652388352") //赵雪圆
				&& !mobile.equals("15210500649")// 张向
		) {
			logger.debug("短信发送失败，开发模式不能发送短信");
			return "";
		}

        if(mobile.length() != 11){
			logger.debug("手机号码不正确发送失败");
			return "";
		}
		try {
        	String tKey = String.valueOf(new Date().getTime()).substring(0,10);
        	String username = null;
        	String password = null;
			switch (type) {
				case TYPE_HY:
					username = usernameHY;
					password = passwordHY;
					break;
				case TYPE_YX:
					username = usernameYX;
					password = passwordYX;
					break;
			}
			param = "{" +
					"\"content\":\"" + content + SMS_RIGHT + "\"," +
					"\"mobile\":\"" + mobile + "\"," +
					"\"tKey\":\"" + tKey + "\"," +
					"\"username\":\"" + username + "\"," +
					"\"password\":\"" + MD5Generator.generate(MD5Generator.generate(password) + tKey) + "\"" +
					"}";

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return param;
	}

}
