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;

/**
 * 创建队列
 *
 * @author 颜佐光
 */
@TableAnnotation("Queue_Queue")
public class QueueVo extends BaseVo implements InitDao {
    /**
     * 队列编号
     */
    private String queueId;

    /**
     * 队列名称
     */
    private String queueName;

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

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

    /**
     * 优先级队列
     */
    private int priority;

    /**
     * 死信处理,在死信处理时,则死信交换器是有效的
     */
    private long dedTime;

    /**
     * 死信处理交换器名称
     */
    private String dedExchangeName;

    /**
     * 死信处理队列名称
     */
    private String dedQueueName;

    /**
     * 死信处理路由键
     */
    private String dedRouteKey;

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

    /**
     * 检测函数
     */
    public void check() {
        CheckerHelper check = CheckerHelper.newInstance()
                .notBlankCheck("QueueName", this.getQueueName())
                .notBlankCheck("ExchangeName", this.getExchangeName())
                .notBlankCheck("RouteKey", this.getRouteKey())
                .checkException(this);
        if (this.getDedTime() > 0
                || !StringHelper.isEmpty(this.getDedQueueName())
                || !StringHelper.isEmpty(this.getDedExchangeName())
                || !StringHelper.isEmpty(this.getDedRouteKey())
        ) {
            check.notBlankCheck("DelayQueueName", this.getDedQueueName())
                    .notBlankCheck("DelayExchangeName", this.getDedExchangeName())
                    .notBlankCheck("DelayRouteKey", this.getDedRouteKey())
                    .checkException(this);
        }
    }

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

    /**
     * 构造函数,用于创建延迟队列。</p>
     * 会创建queueName、exchangeName并且通过routeKey绑定。
     *
     * @param queueName    队列名称
     * @param exchangeName 交换器名称
     * @param routeKey     路由键
     */
    public QueueVo(String queueName, String exchangeName, String routeKey) {
        this.queueName = queueName;
        this.exchangeName = exchangeName;
        this.routeKey = routeKey;
    }

    /**
     * 构造函数,用于创建延迟队列。</p>
     * 会创建queueName、exchangeName并且通过routeKey绑定。
     *
     * @param queueName 队列名称,交换器名称,路由键
     */
    public QueueVo(String queueName) {
        this.queueName = queueName;
        this.exchangeName = queueName;
        this.routeKey = queueName;
    }

    /**
     * 构造函数,用于创建延迟队列。</p>
     * 创建 queueName、exchangeName 并且通过 routeKey 绑定, 创建 dedQueueName、dedExchangeName 并且通过 dedRouteKey 绑定,
     * 将 queueName 的死信队列设置为 dedExchangeName 和 dedRouteKey .
     *
     * @param queueName       队列名称
     * @param exchangeName    交换器名称
     * @param routeKey        路由键
     * @param dedTime         死信时间
     * @param dedExchangeName 死信交换器名称
     * @param dedQueueName    死信交换队列名称
     * @param dedRouteKey     死信路由键
     */
    public QueueVo(String queueName, String exchangeName, String routeKey, long dedTime, String dedExchangeName, String dedQueueName, String dedRouteKey) {
        this.queueName = queueName;
        this.exchangeName = exchangeName;
        this.routeKey = routeKey;
        this.dedTime = dedTime;
        this.dedExchangeName = dedExchangeName;
        this.dedQueueName = dedQueueName;
        this.dedRouteKey = dedRouteKey;
    }


    /**
     * 构造函数,用于创建延迟队列。</p>
     * 创建 queueName、exchangeName 并且通过 routeKey 绑定, 创建 dedQueueName、dedExchangeName 并且通过 dedRouteKey 绑定,
     * 将 queueName 的死信队列设置为 dedExchangeName 和 dedRouteKey .
     *
     * @param queueName    队列名称,路由键,交换器名称
     * @param dedTime      死信时间
     * @param dedQueueName 死信交换器名称,死信交换队列名称,死信路由键
     */
    public QueueVo(String queueName, long dedTime, String dedQueueName) {
        this.queueName = queueName;
        this.exchangeName = queueName;
        this.routeKey = queueName;
        this.dedTime = dedTime;
        this.dedExchangeName = dedQueueName;
        this.dedQueueName = dedQueueName;
        this.dedRouteKey = dedQueueName;
    }

    public String getQueueId() {
        return queueId;
    }

    public void setQueueId(String queueId) {
        this.queueId = queueId;
    }

    public String getQueueName() {
        return queueName;
    }

    public void setQueueName(String queueName) {
        this.queueName = queueName;
    }

    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 int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

    public long getDedTime() {
        return dedTime;
    }

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

    public String getDedExchangeName() {
        return dedExchangeName;
    }

    public void setDedExchangeName(String dedExchangeName) {
        this.dedExchangeName = dedExchangeName;
    }

    public String getDedQueueName() {
        return dedQueueName;
    }

    public void setDedQueueName(String dedQueueName) {
        this.dedQueueName = dedQueueName;
    }

    public String getDedRouteKey() {
        return dedRouteKey;
    }

    public void setDedRouteKey(String dedRouteKey) {
        this.dedRouteKey = dedRouteKey;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    @Override
    public void init() {
        this.dedExchangeName = StringHelper.getFirst(this.dedExchangeName, "");
        this.dedQueueName = StringHelper.getFirst(this.dedQueueName, "");
        this.dedRouteKey = StringHelper.getFirst(this.dedRouteKey, "");
        this.createDate = StringHelper.getFirst(this.createDate, DateHelper.getNow());
    }
}