package com.kxs.product.api.amqp.rabbit;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kxs.common.mq.enums.MQSendTypeEnum;
import com.kxs.common.mq.model.AbstractMQ;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessageProperties;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * mq 商城下单过期队列 配置
 *
 * @author Pota1ovO
 * @date 2024-05-07
 */
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class RabbitShopTimeoutQueueMQ extends AbstractMQ {


    /**
     * 订单交易队列
     */
    public static final String QUEUE_NAME = "QUEUE_SHOP_TIMEOUT_DIVISION";

    /**
     * 死队列名称
     */
    public static final String DEAD_QUEUE_NAME = "DEAD_QUEUE_SHOP_TIMEOUT_DIVISION";

    /**
     * 内置msg 消息体定义
     **/
    private MsgEntity msgEntity;

    /**
     *  定义Msg消息载体
     **/
    @Data
    public static class MsgEntity {
        /**
         * 主键ID
         */
        private Integer id;


        /**
         * 新增时间
         */
        private LocalDateTime createTime;


        /**
         * 更新时间
         */
        private LocalDateTime updateTime;


        /**
         * 删除标记，0未删除，1已删除
         */
        private String delFlag;


        /**
         * 版本
         */
        private Integer version;


        /**
         * 订单号
         */
        private String orderSn;


        /**
         * 用户ID
         */
        private Long userId;


        /**
         * 提货方式 0自提 1邮寄
         */
        private Integer getMode;


        /**
         * 支付渠道 0余额 1支付宝 2微信 3盟主储蓄金
         */
        private Integer payType;


        /**
         * 支付时间
         */
        private LocalDateTime payTime;


        /**
         * 发货时间
         */
        private LocalDateTime sendTime;


        /**
         * 备注
         */
        private String remark;


        /**
         * 收货人
         */
        private String consignee;


        /**
         * 收货电话
         */
        private String phone;


        /**
         * 收货地址
         */
        private String address;


        /**
         * 快递单号
         */
        private String erpSn;


        /**
         * 快递公司
         */
        private String erpName;


        /**
         * 状态 0未支付 1已支付 2已发货 3已完成 4已取消
         */
        private Integer status;


        /**
         * 退款状态 0未申请 1已申请 2申请通过 3申请驳回
         */
        private Integer returnStatus;

        /**
         * 操作人
         */
        private String updateBy;

        /**
         * 退货原因
         */
        private String returnReason;


        /**
         * 申请退款时间
         */
        private LocalDateTime returnTime;


        /**
         * 退款金额
         */
        private BigDecimal returnPrice;

        /**
         * 顶级创客ID
         */
        private Integer topUserId;

        /**
         * 订单金额
         */
        private BigDecimal totalPrice;


        /**
         * 支付金额
         */
        private BigDecimal payPrice;


        /**
         * 交易流水号
         */
        private String tradeNo;


        /**
         * 自提仓库ID
         */
        private Integer warehouseId;


        /**
         * 订单类型 0商城订单 1分仓额度 2小分仓额度 3小盟主订单 4大盟主订单
         */
        private Integer orderType;
    }

    @Override
    public String getQueueName() {

        return QUEUE_NAME;
    }

    @Override
    public String getDeadQueueName() {

        return DEAD_QUEUE_NAME;
    }

    @Override
    public MQSendTypeEnum getMqType() {

        return MQSendTypeEnum.DELAY;
    }

    @Override
    public Message toMessage() {
        String message = JSONObject.toJSONString(msgEntity);
        // 构建消息体
        return MessageBuilder.withBody(message.getBytes())
                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
                .setMessageId(UUID.randomUUID().toString())
                .build();
    }

    /**
     * 构造发送消息
     */
    public static RabbitShopTimeoutQueueMQ build(MsgEntity message){

        return new RabbitShopTimeoutQueueMQ(message);
    }

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

}
