package com.yanzuoguang.mq.vo;

import com.yanzuoguang.dao.TableAnnotation;
import com.yanzuoguang.util.helper.CheckerHelper;
import com.yanzuoguang.util.helper.DateHelper;
import com.yanzuoguang.util.helper.StringHelper;
import com.yanzuoguang.util.vo.BaseVo;
import com.yanzuoguang.util.vo.InitDao;
import io.swagger.annotations.ApiModelProperty;

/**
 * 发送消息
 *
 * @author 颜佐光
 */
@TableAnnotation("Queue_Message")
public class MessageVo extends BaseVo implements InitDao {

    /**
     * 延迟方式:0-自动,1-私有,2-公有
     */
    @ApiModelProperty(notes = "延迟方式:0-公有,1-私有")
    public static final int DED_TIME_TYPE_PUBLIC = 0;
    public static final int DED_TIME_TYPE_PRIVATE = 1;

    /**
     * 消息编号,仅内部使用,消息编号会发送变动
     */
    private String messageId;

    /**
     * 交换器
     */
    private String exchangeName;

    /**
     * 路由键
     */
    private String routeKey;

    /**
     * 消息内容
     */
    private String message;

    /**
     * 延迟毫秒
     */
    private long dedTime;

    /**
     * 延迟方式:0-自动,1-私有,2-公有
     */
    @ApiModelProperty(notes = "延迟方式:0-自动,1-私有,2-公有")
    private int dedTimeType;
    /**
     * 处理次数
     */
    private int handleCount;

    /**
     * 上次处理时间
     */
    private String handleTime;

    /**
     * 发送批次
     */
    private String batchId;

    /**
     * 创建时间
     */
    private String createTime;

    /**
     * 检测函数
     */
    public void check() {
        CheckerHelper.newInstance()
                .notBlankCheck("ExchangeName", this.getExchangeName())
                .notBlankCheck("RouteKey", this.getRouteKey())
                .notBlankCheck("Message", this.getMessage())
                .checkException(this);
    }

    /**
     * 构造函数
     */
    public MessageVo() {
    }


    /**
     * 构造函数
     *
     * @param exchangeNameRouteKey 交换器名称+路由键
     * @param message              消息内容
     */
    public MessageVo(String exchangeNameRouteKey, String message) {
        this(exchangeNameRouteKey, exchangeNameRouteKey, message);
    }

    /**
     * 构造函数
     *
     * @param exchangeName 交换器名称
     * @param routeKey     路由键
     * @param message      消息内容
     */
    public MessageVo(String exchangeName, String routeKey, String message) {
        this.exchangeName = exchangeName;
        this.routeKey = routeKey;
        this.message = message;
    }

    /**
     * 构造函数
     *
     * @param exchangeNameRouteKey 交换器名称+路由键
     * @param message              消息内容
     * @param dedTime              过期时间
     */
    public MessageVo(String exchangeNameRouteKey, String message, long dedTime) {
        this(exchangeNameRouteKey, exchangeNameRouteKey, message, dedTime);
    }

    /**
     * 构造函数
     *
     * @param exchangeNameRouteKey 交换器名称+路由键
     * @param message              消息内容
     * @param dedTime              过期时间
     * @param dedTimeType          过期处理方式
     */
    public MessageVo(String exchangeNameRouteKey, String message, long dedTime, int dedTimeType) {
        this(exchangeNameRouteKey, exchangeNameRouteKey, message, dedTime, dedTimeType);
    }


    /**
     * 构造函数
     *
     * @param exchangeName 交换器名称
     * @param routeKey     路由键
     * @param message      消息内容
     * @param dedTime      过期时间
     */
    public MessageVo(String exchangeName, String routeKey, String message, long dedTime) {
        this(exchangeName, routeKey, message, dedTime, DED_TIME_TYPE_PUBLIC);
    }

    /**
     * 构造函数
     *
     * @param exchangeName 交换器名称
     * @param routeKey     路由键
     * @param message      消息内容
     * @param dedTime      过期时间
     * @param dedTimeType  过期处理方式
     */
    public MessageVo(String exchangeName, String routeKey, String message, long dedTime, int dedTimeType) {
        this.exchangeName = exchangeName;
        this.routeKey = routeKey;
        this.message = message;
        this.dedTime = (int) dedTime;
        this.dedTimeType = dedTimeType;
    }

    /**
     * 构造函数
     *
     * @param exchangeName 交换器名称
     * @param routeKey     路由键
     * @param message      消息内容
     * @param handleTime   处理时间
     */
    public MessageVo(String exchangeName, String routeKey, String message, String handleTime) {
        this.exchangeName = exchangeName;
        this.routeKey = routeKey;
        this.message = message;
        this.handleTime = handleTime;
        this.dedTimeType = DED_TIME_TYPE_PUBLIC;
    }

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public String getExchangeName() {
        return exchangeName;
    }

    public void setExchangeName(String exchangeName) {
        this.exchangeName = exchangeName;
    }

    public String getRouteKey() {
        return routeKey;
    }

    public void setRouteKey(String routeKey) {
        this.routeKey = routeKey;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public long getDedTime() {
        return dedTime;
    }

    public void setDedTime(long dedTime) {
        this.dedTime = dedTime;
    }

    public int getDedTimeType() {
        return dedTimeType;
    }

    public void setDedTimeType(int dedTimeType) {
        this.dedTimeType = dedTimeType;
    }

    public int getHandleCount() {
        return handleCount;
    }

    public void setHandleCount(int handleCount) {
        this.handleCount = handleCount;
    }

    public String getHandleTime() {
        return handleTime;
    }

    public void setHandleTime(String handleTime) {
        this.handleTime = handleTime;
    }

    public String getBatchId() {
        return batchId;
    }

    public void setBatchId(String batchId) {
        this.batchId = batchId;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    @Override
    public void init() {
        this.batchId = StringHelper.getFirst(this.batchId, StringHelper.EMPTY);
        this.message = StringHelper.getFirst(this.message, StringHelper.EMPTY);
        this.handleTime = StringHelper.getFirst(this.handleTime, DateHelper.getNow());
        this.createTime = StringHelper.getFirst(this.createTime, DateHelper.getNow());
    }
}