package com.cyksj.model.dto;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

/**
 * @author valor.
 * @date 2019-08-02 12:53
 */
@Getter
@Setter
@JacksonXmlRootElement(localName = "xml")
public class MsgEvent {

    /**
     * 开发者微信号
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "ToUserName")
    private String toUserName;

    /**
     * 发送方帐号 (一个OpenID)
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "FromUserName")
    private String fromUserName;

    /**
     * 消息创建时间 (整型)
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "CreateTime")
    private Long createTime;

    /**
     * 消息类型
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "MsgType")
    private MsgType msgType;

    /**
     * 当消息为event时 触发的事件类型
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "Event")
    private Event event;

    /**
     * 事件KEY值
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "EventKey")
    private String eventKey;

    /**
     * 二维码扫码时 会出现该参数
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "Ticket")
    private String ticket;

    /**
     * 当消息为text时 消息内容
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "Content")
    private String content;

    /**
     * 图文消息个数
     *   当用户发送文本、图片、视频、图文、地理位置这五种消息时，开发者只能回复1条图文消息
     *   其余场景最多可回复8条图文消息
     */
    @JacksonXmlCData
    @JacksonXmlProperty(localName = "ArticleCount")
    private Integer articleCount;

    /**
     * 图文消息信息，注意，如果图文数超过限制，则将只发限制内的条数
     */
    @JacksonXmlProperty(localName = "item")
    @JacksonXmlElementWrapper(localName = "Articles")
    private List<Article> articles;

    public enum MsgType {
        /**
         * 消息类型
         */
        event("事件消息"),
        text("文本消息"),
        news("图文消息"),
        image("图片消息"),
        voice("语音消息"),
        video("视频消息"),
        shortvideo("小视频消息"),
        location("地理位置消息"),
        link("链接消息");

        MsgType(String desc) { }
    }

    public enum Event {
        /**
         * 当消息为event时 可能是下列事件
         */
        subscribe("订阅"),
        unsubscribe("取消订阅"),
        SCAN("订阅状态中, 扫码二维码"),
        LOCATION("上报地理位置"),
        CLICK("点击自定义菜单(拉取子菜单 微信不会调用接口)"),
        VIEW("点击菜单跳转链接"),
        TEMPLATESENDJOBFINISH("模板消息"),
        view_miniprogram("点击菜单跳转小程序");

        Event(String desc) { }
    }

    @Getter
    @Setter
    public static class Article {
        /**
         * 扫码 图文消息标题
         */
        @JacksonXmlCData
        @JacksonXmlProperty(localName = "Title")
        private String title;

        /**
         * 扫码 图文消息描述
         */
        @JacksonXmlCData
        @JacksonXmlProperty(localName = "Description")
        private String desc;

        /**
         * 扫码 图文消息图片链接
         */
        @JacksonXmlCData
        @JacksonXmlProperty(localName = "PicUrl")
        private String picUrl;

        /**
         * 扫码 图文消息跳转链接
         */
        @JacksonXmlCData
        @JacksonXmlProperty(localName = "Url")
        private String link;
    }
}
