package com.heyu.api.listener.delay.handler;

import com.alibaba.fastjson.JSONObject;
import com.heyu.api.data.enums.OrderStatusEnums;
import com.heyu.api.data.dao.vv.VvTradeOrderLineDao;
import com.heyu.api.data.dto.WeiXinPayDelayDTO;
import com.heyu.api.data.entity.vv.VvTradeOrderLineEntity;
import com.heyu.api.data.utils.R;
import com.heyu.api.listener.BaseDelayedHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;


/**
 * 微信支付订单关闭处理器
 * 用于处理超时未支付的订单,将订单状态更新为关闭状态
 */
@Slf4j
@Component("weiXinPayCloseHandler")
public class WeiXinPayCloseHandler extends BaseDelayedHandler {

    @Autowired
    private VvTradeOrderLineDao vvTradeOrderLineDao;


    /**
     * 处理微信支付延迟关闭消息
     *
     * @param message 延迟消息内容,包含交易订单ID等信息
     * @return 处理结果
     */
    @Override
    public R handler(String message) {
        log.info("[微信支付订单关闭] 接收到延迟关单消息, message={}", message);

        try {
            // 解析延迟消息
            WeiXinPayDelayDTO weiXinPayDelayDTO = JSONObject.parseObject(message, WeiXinPayDelayDTO.class);
            Long tradeOrderId = weiXinPayDelayDTO.getTradeOrderId();

            log.info("[微信支付订单关闭] 开始处理订单关闭逻辑, tradeOrderId={}", tradeOrderId);

            // 根据交易订单ID查询所有订单明细
            List<VvTradeOrderLineEntity> vvTradeOrderLineEntities = vvTradeOrderLineDao.selectVvTradeOrderLineByTradeOrderId(tradeOrderId);

            if (vvTradeOrderLineEntities == null || vvTradeOrderLineEntities.isEmpty()) {
                log.warn("[微信支付订单关闭] 未查询到订单明细数据, tradeOrderId={}", tradeOrderId);
                return R.ok();
            }

            log.info("[微信支付订单关闭] 查询到订单明细数量={}, tradeOrderId={}", vvTradeOrderLineEntities.size(), tradeOrderId);

            int closedCount = 0;
            int skippedCount = 0;

            // 遍历订单明细,关闭待支付状态的订单
            for (VvTradeOrderLineEntity vvTradeOrderLineEntity : vvTradeOrderLineEntities) {
                Long orderLineId = vvTradeOrderLineEntity.getId();
                String currentStatus = vvTradeOrderLineEntity.getStatus();

                // 只处理待支付状态的订单
                if(OrderStatusEnums.wait_pay.getStatus().equals(currentStatus)){
                    log.info("[微信支付订单关闭] 关闭待支付订单, tradeOrderId={}, orderLineId={}, status={} -> {}",
                            tradeOrderId, orderLineId, currentStatus, OrderStatusEnums.close.getStatus());

                    // 更新订单状态为关闭
                    vvTradeOrderLineEntity.setStatus(OrderStatusEnums.close.getStatus());
                    // 设置关闭时间
                    vvTradeOrderLineEntity.setGmtClose(new Date());
                    // 更新数据库
                    vvTradeOrderLineDao.updateVvTradeOrderLineById(vvTradeOrderLineEntity);

                    closedCount++;
                    log.info("[微信支付订单关闭] 订单关闭成功, tradeOrderId={}, orderLineId={}", tradeOrderId, orderLineId);
                } else {
                    // 非待支付状态的订单不处理,仅记录日志
                    log.info("[微信支付订单关闭] 订单状态非待支付,跳过处理, tradeOrderId={}, orderLineId={}, currentStatus={}",
                            tradeOrderId, orderLineId, currentStatus);
                    skippedCount++;
                }
            }

            log.info("[微信支付订单关闭] 处理完成, tradeOrderId={}, 关闭订单数={}, 跳过订单数={}",
                    tradeOrderId, closedCount, skippedCount);

            return R.ok();

        } catch (Exception e) {
            log.error("[微信支付订单关闭] 处理异常, message={}", message, e);
            return R.error("订单关闭处理失败: " + e.getMessage());
        }
    }
}

