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 没秃顶的码农
 * @date 2024-04-25
 */
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class RabbitKxsOrderQueueMQ extends AbstractMQ {


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

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

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

    /**
     *  定义Msg消息载体
     **/
    @Data
    public static class MsgEntity {

        /**
         * 订单ID
         */
        private String id;
        /**
         * 订单状态（0待付款，1已付款，2已完成，3已发货，4已退款）
         */
        private Integer status;
        /**
         * 订单创建时间
         */
        private String createDate;
        /**
         * 发货的机具券码
         */
        private String snNos;
        /**
         * 备注
         */
        private String remark;
        /**
         * 买入计数
         */
        private Integer buyCount;
        /**
         * 支付状态
         */
        private Integer payStatus;
        /**
         * 产品 ID
         */
        private Integer productId;
        /**
         * 发送状态
         */
        private Integer sendStatus;
        /**
         * 提货方式（1邮寄到付，2上门自提）
         */
        private Integer deliveryType;
        /**
         * 退款状态
         */
        private Integer refundStatus;
        /**
         * 支付方式（1支付宝，3余额，4储蓄金）
         */
        private Integer payMode;
        /**
         * 发送日期
         */
        private LocalDateTime sendDate;
        /**
         * 支付时间
         */
        private LocalDateTime payDate;
        /**
         * 地址
         */
        private String address;
        /**
         * 所在省市区
         */
        private String areas;
        /**
         * 支付总金额
         */
        private BigDecimal totalPrice;
        /**
         * 移动电话
         */
        private String mobile;
        /**
         * 真实姓名
         */
        private String realName;
        /**
         * 订单号
         */
        private String orderNo;
        /**
         * 用户 ID
         */
        private Integer userId;
        /**
         * 父订单 ID
         */
        private Integer parentOrderId;


    }

    @Override
    public String getQueueName() {

        return QUEUE_NAME;
    }

    @Override
    public String getDeadQueueName() {

        return DEAD_QUEUE_NAME;
    }

    @Override
    public MQSendTypeEnum getMqType() {

        return MQSendTypeEnum.QUEUE;
    }

    @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 RabbitKxsOrderQueueMQ build(MsgEntity message){

        return new RabbitKxsOrderQueueMQ(message);
    }

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

}
