package com.foxinmy.weixin4j.mp.message;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.annotation.JSONCreator;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.util.NameValue;

/**
 * 模板消息
 *
 * @className TemplateMessage
 * @author jinyu(foxinmy@gmail.com)
 * @date 2014年9月29日
 * @since JDK 1.6
 * @see <a href=
 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">模板消息</a>
 */
public class TemplateMessage implements Serializable {

    private static final long serialVersionUID = 7950608393821661436L;

    /**
     * 用户的openid
     */
    @JSONField(name = "touser")
    private String toUser;
    /**
     * 模板ID
     */
    @JSONField(name = "template_id")
    private String templateId;
    /**
     * 点击消息跳转的url
     */
    private String url;
    /**
     * 头部信息(first第一行)
     */
    @JSONField(serialize = false)
    private NameValue head;
    /**
     * 尾部信息(remark最后行)
     */
    @JSONField(serialize = false)
    private NameValue tail;

    /**
     * 跳小程序所需数据，不需跳小程序可不用传该数据
     */
    @JSONField(name = "miniprogram")
    private Miniprogram miniprogram;
    /**
     * 数据项
     */
    @JSONField(name = "data")
    private Map<String, NameValue> content;

    private final static String HEAD_KEY = "first";
    private final static String TAIL_KEY = "remark";
    private final static String DEFAULT_COLOR = "#173177";

    @JSONCreator
    public TemplateMessage(@JSONField(name = "toUser") String toUser, @JSONField(name = "templateId") String templateId,
            @JSONField(name = "url") String url) {
        this.toUser = toUser;
        this.templateId = templateId;
        this.url = url;
        this.content = new HashMap<String, NameValue>();
    }

    public String getToUser() {
        return toUser;
    }

    public String getTemplateId() {
        return templateId;
    }

    public String getUrl() {
        return url;
    }

    public NameValue getHead() {
        return head == null ? content.get(HEAD_KEY) : head;
    }

    public NameValue getTail() {
        return tail == null ? content.get(TAIL_KEY) : tail;
    }

    public Map<String, NameValue> getContent() {
        return content;
    }

    /**
     * 新增头部字段(默认颜色为#FF0000)
     *
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushHead(String text) {
        return pushHead("#FF0000", text);
    }

    /**
     * 新增头部字段
     *
     * @param color
     *            文字颜色
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushHead(String color, String text) {
        head = new NameValue(color, text);
        content.put(HEAD_KEY, head);
        return this;
    }

    /**
     * 新增尾部字段(默认颜色为#173177)
     *
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushTail(String text) {
        return pushTail(DEFAULT_COLOR, text);
    }

    /**
     * 新增尾部字段
     *
     * @param color
     *            文字颜色
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushTail(String color, String text) {
        tail = new NameValue(color, text);
        content.put(TAIL_KEY, tail);
        return this;
    }

    /**
     * 新增字段项(默认颜色为#173177)
     *
     * @param key
     *            预留的字段名
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushItem(String key, String text) {
        return pushItem(key, DEFAULT_COLOR, text);
    }

    /**
     * 新增字段项
     *
     * @param key
     *            预留的字段名
     * @param color
     *            文字颜色
     * @param text
     *            字段文本
     * @return
     */
    public TemplateMessage pushItem(String key, String color, String text) {
        content.put(key, new NameValue(color, text));
        return this;
    }

    /**
     * 设置所有字段项
     *
     * @param items
     */
    public void setItems(Map<String, NameValue> items) {
        this.content = items;
    }

    public Miniprogram getMiniprogram() {
		return miniprogram;
	}

	public void setMiniprogram(String appid,String pagepath) {
        this.miniprogram = new Miniprogram(appid, pagepath);
    }

    @Override
    public String toString() {
        return "TemplateMessage [toUser=" + toUser + ", templateId=" + templateId + ", url=" + url + ", head="
                + getHead() + ", tail=" + getTail() + ", content=" + content + "]";
    }
    /**
     * 小程序参数
     * @className Miniprogram
     * @author jinyu(foxinmy@gmail.com)
     * @date 2018年5月4日
     * @since JDK 1.7
     * @see
     */
    static class Miniprogram{
    	  /**
         * 所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系）
         */
        private String appid;
        /**
         * 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar）
         */
        private String pagepath;
		public Miniprogram(String appid, String pagepath) {
			this.appid = appid;
			this.pagepath = pagepath;
		}
		public String getAppid() {
			return appid;
		}
		public String getPagepath() {
			return pagepath;
		}
    }
}
