package com.jeequan.jeepay.components.mq.model;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.components.mq.constant.MQSendTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 定义MQ消息格式
 * 业务场景： [ 清除商户登录信息 ]
 *
 * @author terrfly
 * @date 2021/7/22 15:25
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CleanMchLoginAuthCacheMQ extends AbstractMQ {

    /**
     * 【！重要配置项！】 定义MQ名称
     **/
    public static final String MQ_NAME = "QUEUE_CLEAN_MCH_LOGIN_AUTH_CACHE";

    /**
     * 清空缓存类型
     **/
    public static final String CLEAN_CACHE_TYPE_LOGIN_TOKEN = "loginToken"; // 登录token
    public static final String CLEAN_CACHE_TYPE_LOGIN_ERR = "loginErr"; // 登录限制

    /**
     * 内置msg 消息体定义
     **/
    private MsgPayload payload;

    /**
     * 【！重要配置项！】 定义Msg消息载体
     **/
    @Data
    @AllArgsConstructor
    public static class MsgPayload {

        /**
         * 清空缓存类型，默认清空 登录token类型
         **/
        private String cleanCacheType;

        /**
         * 清空缓存用户列表
         **/
        private List<String> list;

    }

    @Override
    public String getMQName() {
        return MQ_NAME;
    }

    /**
     * 【！重要配置项！】
     **/
    @Override
    public MQSendTypeEnum getMQType() {
        return MQSendTypeEnum.QUEUE;  // QUEUE - 点对点 、 BROADCAST - 广播模式
    }

    @Override
    public String toMessage() {
        return JSONObject.toJSONString(payload);
    }

    /**
     * 【！重要配置项！】 构造MQModel , 一般用于发送MQ时
     **/
    public static CleanMchLoginAuthCacheMQ build(List<Long> list) {
        return build(list.stream().map(String::valueOf).collect(Collectors.toList()), CLEAN_CACHE_TYPE_LOGIN_TOKEN);
    }

    /**
     * 【！重要配置项！】 构造MQModel , 一般用于发送MQ时
     **/
    public static CleanMchLoginAuthCacheMQ build(List<String> list, String cleanCacheType) {
        return new CleanMchLoginAuthCacheMQ(new MsgPayload(cleanCacheType, list));
    }

    /**
     * 解析MQ消息， 一般用于接收MQ消息时
     **/
    public static MsgPayload parse(String msg) {
        return JSON.parseObject(msg, MsgPayload.class);
    }

    /**
     * 定义 IMQReceiver 接口： 项目实现该接口则可接收到对应的业务消息
     **/
    public interface IMQReceiver {
        void receive(MsgPayload payload);
    }

}
