package cn.hmsoft.weixin.service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.hmsoft.frame.constants.FrameStatus;
import cn.hmsoft.frame.data.model.FrameOptr;
import cn.hmsoft.frame.service.FrameService;
import cn.hmsoft.frame.util.FrameAssertUtil;
import cn.hmsoft.helper.StringHelper;
import cn.hmsoft.log.LogHelper;
import cn.hmsoft.weixin.data.dao.WxTemplateDao;
import cn.hmsoft.weixin.data.model.WxTemplate;
import cn.hmsoft.weixin.entity.response.TemplateAddTemplateResponseJson;
import cn.hmsoft.weixin.entity.response.TemplateGetAllTemplateResponseJson;
import cn.hmsoft.weixin.request.TemplateAddTemplateRequest;
import cn.hmsoft.weixin.request.TemplateDelTemplateRequest;
import cn.hmsoft.weixin.request.TemplateGetAllPrivateTemplateRequest;

@Service
public class WxTemplateService extends FrameService {

	@Autowired
	private WxTemplateDao daoTemplate;

	public void addTemplate(int wx_id, WxTemplate template, FrameOptr optr) {
		FrameAssertUtil.checkParam(template.getTemplate_value());
		String sql = "select * from wx_template where wx_id=? and template_name=?";
		WxTemplate mReply = this.daoTemplate.findBySql(WxTemplate.class, sql, wx_id, template.getTemplate_name());
		FrameAssertUtil.isNull(mReply, "模板消息[" + template.getTemplate_name() + "]已经存在");
		template.setModify_time(LocalDateTime.now());
		if (StringHelper.isNotEmpty(template.getTemplate_value())) {
			WxTemplate t = this.daoTemplate.find("template_value", template.getTemplate_value());
			if (t != null) {
				template.setTemplate_code(t.getTemplate_code());
			}
		}
		this.daoTemplate.insert(template);
		if (StringHelper.isNotEmpty(template.getTemplate_code())) {
			// 自动同步
			this.syncTemplate(wx_id);
		}

	}

	public void editTemplate(int wx_id, WxTemplate template, FrameOptr optr) {
		// FrameAssertUtil.checkParam(template.getBusiness_type(),
		// template.getTemplate_value());
		WxTemplate wp = this.daoTemplate.find(template.getTemplate_id());
		FrameAssertUtil.isNotNull(wp, "基础数据错误：模板消息不存在");
		// 去服务器请求
		String sql = "select * from wx_template where wx_id=? and template_name=? and template_id!=?";
		FrameAssertUtil.isNull(
				this.daoTemplate.findBySql(sql, wx_id, template.getTemplate_name(), template.getTemplate_id()),
				"模板消息[" + template.getTemplate_name() + "]已经存在");
		template.setModify_time(LocalDateTime.now());
		template.setTemplate_example(null);
		this.daoTemplate.update(template);

	}

	public void delTemplate(int wx_id, int template_id, FrameOptr optr) {
		String sql = "delete from wx_template where wx_id=? and template_id=?";
		this.daoTemplate.updateBySql(sql, wx_id, template_id);

	}

	public void delAllTemplate(int wx_id, FrameOptr optr) {
		// 去服务器获取列表
		TemplateGetAllPrivateTemplateRequest tRequest = new TemplateGetAllPrivateTemplateRequest();
		tRequest.setWxDefine(wx_id);
		TemplateGetAllTemplateResponseJson sJson = tRequest.request();
		if (sJson == null)
			return;
		for (TemplateGetAllTemplateResponseJson.TemplateInfo info : sJson.getTemplate_list()) {
			TemplateDelTemplateRequest req = new TemplateDelTemplateRequest(info.getTemplate_id());
			req.setWxDefine(wx_id);
			req.request();
		}

	}

	/*********************************************
	 * 和微信服务器同步模版消息
	 */
	public void syncTemplate(int wx_id) {
		// 去服务器获取列表
		TemplateGetAllPrivateTemplateRequest tRequest = new TemplateGetAllPrivateTemplateRequest();
		tRequest.setWxDefine(wx_id);
		TemplateGetAllTemplateResponseJson sJson = tRequest.request();
		if (sJson == null)
			return;
		// 获取数据库定义的模版
		List<WxTemplate> list = this.daoTemplate.listTemplate(wx_id);

		for (TemplateGetAllTemplateResponseJson.TemplateInfo info : sJson.getTemplate_list()) {
			boolean has_flag = false;
			for (WxTemplate t : list) {
				if (StringHelper.isEmpty(t.getTemplate_code()))
					continue;
				// 同一个模版
				if (info.getTemplate_id().equals(t.getTemplate_code())) {
					// 直接update
					setTemplateFromInfo(info, t);
					this.daoTemplate.update(t);

					// 表示更新过
					t.setRemarkValueMap(new HashMap<String, String>());
					has_flag = true;
				}

			}
			if (!has_flag) {
				// 没有，新建一个
				WxTemplate template = new WxTemplate();
				setTemplateFromInfo(info, template);
				template.setBusiness_type(null);
				template.setTemplate_code(info.getTemplate_id());
				template.setModify_time(LocalDateTime.now());
				template.setTemplate_name("未知业务模版");
				template.setTemplate_note("自动从服务器同步获取，未定义适用业务");
				template.setTemplate_status(FrameStatus.InActive.toString());
				template.setWx_id(wx_id);
				this.daoTemplate.insert(template);
			}
		}

		int addCount = 0;
		for (WxTemplate template : list) {
			// 服务器发现有配置，
			if (template.getRemarkValueMap() != null)
				continue;
			if (StringHelper.isEmpty(template.getTemplate_value())) {
				// 说明之前定义的已经移除，删除对应的模版编号
				this.daoTemplate.updateTemplateCode(template.getTemplate_id(), null);
				continue;
			}
			// 如果服务器没有配置，自动添加
			TemplateAddTemplateRequest rq = new TemplateAddTemplateRequest(template.getTemplate_value());
			rq.setWxDefine(wx_id);
			TemplateAddTemplateResponseJson json = null;
			try {
				json = rq.request();
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (json != null && StringHelper.isNotEmpty(json.getTemplate_id())) {
				this.daoTemplate.updateTemplateCode(template.getTemplate_id(), json.getTemplate_id());
				addCount++;
			}
		}
		// 只要有更新，重新来一次
		if (addCount > 0) {
			syncTemplate(wx_id);
		}

	}
	
	//{{keyword1.DATA}} 返回 keyword1
	private String getColName(String str) {
		if (StringHelper.isNotEmpty(str) && str.length() > 7) {
			return str.substring(2, str.length() - 7);
		}
		return "";
	}

	private void setTemplateFromInfo(TemplateGetAllTemplateResponseJson.TemplateInfo info, WxTemplate t) {
		t.setTitle_note(info.getTitle());
		t.setTemplate_example(info.getExample());
		//**********老模板返回*********************注意是中文冒号分割
		//		{{first.DATA}}
		//		审核类型：{{keyword1.DATA}}
		//		审核结果：{{keyword2.DATA}}
		//		审核时间：{{keyword3.DATA}}
		//		{{remark.DATA}}
		//**********新模板返回*********************注意是英文冒号分割
		//		考生姓名:{{thing9.DATA}}
		//		考试时间:{{time3.DATA}}
		//		报考级别:{{thing10.DATA}}
		//		考试内容:{{thing4.DATA}}

		LogHelper.info("TemplateInfo-->" + info.getContent());
		String[] content = info.getContent().split("\n");
		if (info.getContent().indexOf("{{keyword") > -1) {//老模板
			if (content.length > 2) {
				t.setKeyword1_note(content[1].split("：")[0]);
				t.setKeyword1_name(this.getColName(content[1].split("：")[1]));
			} else {
				t.setKeyword1_note("");
				t.setKeyword1_name("");
			}
			if (content.length > 3) {
				t.setKeyword2_note(content[2].split("：")[0]);
				t.setKeyword2_name(this.getColName(content[2].split("：")[1]));
			} else {
				t.setKeyword2_note("");
				t.setKeyword2_name("");
			}
			if (content.length > 4) {
				t.setKeyword3_note(content[3].split("：")[0]);
				t.setKeyword3_name(this.getColName(content[3].split("：")[1]));
			} else {
				t.setKeyword3_note("");
				t.setKeyword3_name("");
			}
			if (content.length > 5) {
				t.setKeyword4_note(content[4].split("：")[0]);
				t.setKeyword4_name(this.getColName(content[4].split("：")[1]));
			} else {
				t.setKeyword4_note("");
				t.setKeyword4_name("");
			}
			if (content.length > 6)
				t.setKeyword5_note(content[5].split(":")[0]);
			else
				t.setKeyword5_note("");
			t.setSync_time(LocalDateTime.now());
		} else if (info.getContent().indexOf("{{thing") > -1 || info.getContent().indexOf("{{time") > -1
				|| info.getContent().indexOf("{{amount") > -1) {
			if (content.length > 0) {
				t.setKeyword1_note(content[0].split(":")[0]);
				t.setKeyword1_name(this.getColName(content[0].split(":")[1]));
			} else {
				t.setKeyword1_note("");
				t.setKeyword1_name("");
			}
			if (content.length > 1) {
				t.setKeyword2_note(content[1].split(":")[0]);
				t.setKeyword2_name(this.getColName(content[1].split(":")[1]));
			} else {
				t.setKeyword2_note("");
				t.setKeyword2_name("");
			}
			if (content.length > 2) {
				t.setKeyword3_note(content[2].split(":")[0]);
				t.setKeyword3_name(this.getColName(content[2].split(":")[1]));
			} else {
				t.setKeyword3_note("");
				t.setKeyword3_name("");
			}
			if (content.length > 3) {
				t.setKeyword4_note(content[3].split(":")[0]);
				t.setKeyword4_name(this.getColName(content[3].split(":")[1]));
			} else {
				t.setKeyword4_note("");
				t.setKeyword4_name("");
			}
			if (content.length > 4) {
				t.setKeyword5_note(content[4].split(":")[0]);
				t.setKeyword5_name(this.getColName(content[4].split(":")[1]));
			} else {
				t.setKeyword5_note("");
				t.setKeyword5_name("");
			}
		}
	}
	
	public static void main(String[] args) {
		String str = "{{thing1.DATA}}";
		System.out.println(str.substring(2, str.length() - 7));
	}
}
