package com.seer.teach.mall.app.order.handler;

import cn.hutool.json.JSONUtil;
import com.seer.teach.common.constants.CommonConstant;
import com.seer.teach.mall.entity.GoodsEntity;
import com.seer.teach.mall.entity.OrderEntity;
import com.seer.teach.mall.entity.OrderGoodsEntity;
import com.seer.teach.mall.handler.OrderHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.MQProducer;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class MessageOrderHandler implements OrderHandler {

    @Autowired(required = false)
    private MQProducer mqProducer;

    // 配置是否启用延迟消息，默认为false
    @Value("${mall.order.delay.enabled:true}")
    private boolean delayMessageEnabled;

    // 配置延迟级别，默认为16（30分钟）
    @Value("${mall.order.delay.level:16}")
    private int orderDelayLevel;

    @Override
    public void afterOrderCreate(OrderEntity order, List<OrderGoodsEntity> orderItems, Map<Integer, GoodsEntity> goodsEntityMap) {
        try {
            // 订单创建后的消息发送逻辑
            log.info("订单创建完成，准备发送消息通知，订单号: {}", order.getOrderSn());

            // 1. 发送站内信
            // 2. 根据配置选择订单过期处理方式
            if (delayMessageEnabled) {
                // 使用 RocketMQ 延迟消息实现订单自动过期
                sendDelayMessage(order, orderItems);
            }
            log.info("订单处理完成，订单号: {}，过期处理方式: {}",
                    order.getOrderSn(), delayMessageEnabled ? "RocketMQ延迟消息" : "XXL-JOB定时任务");
        } catch (Exception e) {
            log.error("订单创建后处理失败，订单号: {}", order.getOrderSn(), e);
        }
    }

    /**
     * 发送延迟消息，用于 RocketMQ 实现订单自动过期
     * @param order 订单实体
     * @param orderItems 订单子项
     */
    private void sendDelayMessage(OrderEntity order, List<OrderGoodsEntity> orderItems) {
        Message msg = new Message(CommonConstant.ORDER_CREATE_DELAY_TOPIC, "*", order.getOrderSn(),
                JSONUtil.toJsonStr(order).getBytes(StandardCharsets.UTF_8));
        msg.setDelayTimeLevel(orderDelayLevel);
        try {
            mqProducer.send(msg);
            log.info("订单延迟消息发送完成，订单号: {}，延迟级别: {}", order.getOrderSn(), orderDelayLevel);
        } catch (Exception e) {
            log.info("订单延迟消息发送失败，订单号: {}", order.getOrderSn(), e);
        }
    }
}