package com.galaxis.manatee.entity.ding;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.util.List;
import java.util.Map;

/**
 * @author zcj
 * @version 0.1
 * @date 2020/1/9 9:01 上午
 */
@Data
@AllArgsConstructor
public class DingTalkRobotRequest {

    @JsonProperty(value = "msgtype")
    private String messageType;

    @JsonProperty(value = "at")
    private At at;

    /**
     * 创建请求
     * @param params        参数信息
     *                      text类型请求参数：1.content
     *                      link类型请求参数: 1.text   2.title    3.messageUrl   4.picUrl
     * @param messageType   请求机器人类型
     * @param at            需要@的人
     * @return      请求对象
     */
    public static DingTalkRobotRequest instanceOf(Map<String,String> params, MessageType messageType, At at){

        return switch (messageType){
            case LINK -> new LinkRequest(params, messageType, at);
            default -> new TextRequest(params,messageType,at);
        };
    }

    /**
     * 需要被@的手机号
     */
    @Data
    @AllArgsConstructor
    public static class At{
        /**
         * 需要被@的手机号列表
         */
        private List<String> atMobiles;

        /**
         * 是否@所有人
         */
        private boolean isAtAll;

        /**
         * 获取实例方法
         * @param atMobiles 需要@的人员列表
         * @param isAtAll   是否@所有人
         * @return  需要@的实例
         */
        public static At instance(List<String> atMobiles, Boolean isAtAll){
            return new At(atMobiles,isAtAll);
        }
    }

    /**
     * 消息类型
     */
    @AllArgsConstructor
    @Getter
    public enum MessageType{
        /**
         * 文本类型
         */
        TEXT("text"),
        /**
         * 链接类型
         */
        LINK("link"),
        /**
         * markDown类型
         */
        MARK_DOWN("markdown"),
        /**
         * 跳转卡
         */
        ACTION_CARD("actionCard"),
        /**
         * 信息组卡
         */
        FEED_CARD("feedCard");

        private String value;

    }
}

/**
 * Text内容
 */
@Data
@AllArgsConstructor
class Text{
    /**
     * 需要让机器人发布的内容
     */
    private String content;
}

/**
 * link内容
 */
@Data
@AllArgsConstructor
class Link{
    /**
     * 消息内容。如果太长只会部分展示
     */
    private String text;

    /**
     * 消息标题
     */
    private String title;

    /**
     * 点击消息跳转的URL
     */
    private String messageUrl;

    /**
     * 图片URL
     */
    private String picUrl;
}

/**
 * markdown内容
 */
class MarkDown{

}

/**
 * actionCard内容
 */
class ActionCard{

}

/**
 * feedCard内容
 */
class FeedCard{

}

/**
 * text请求体
 */
@EqualsAndHashCode(callSuper = true)
@Data
class TextRequest extends DingTalkRobotRequest{
    /**
     * text消息
     */
    private Text text;

    public TextRequest(Map<String,String> params,MessageType messageType,At at) {
        super(messageType.getValue(),at);
        this.text = new Text(params.get("content"));
    }
}

@EqualsAndHashCode(callSuper = true)
@Data
class LinkRequest extends DingTalkRobotRequest{
    /**
     * 链接数据对象
     */
    private Link link;

    public LinkRequest(Map<String,String> params,MessageType messageType, At at) {
        super(messageType.getValue(), at);
        this.link = new Link(params.get("text"),params.get("title"),params.get("messageUrl"),params.get("picUrl"));
    }
}
