package com.ycwl.basic.order.event.impl;

import com.ycwl.basic.order.event.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;

/**
 * 支付状态变更监听器示例
 * 应用启动后自动注册到事件管理器
 */
@Slf4j
@Component
public class PaymentStatusChangeListener implements OrderEventListener {
    
    @Resource
    private OrderEventManager orderEventManager;
    
    @PostConstruct
    public void init() {
        // 应用启动后自动注册到事件管理器
        orderEventManager.registerListener(this);
        log.info("支付状态变更监听器注册完成");
    }
    
    @Override
    public void onPaymentStatusChanged(PaymentStatusChangeEvent event) {
        log.info("处理支付状态变更事件: orderId={}, orderNo={}, {} -> {}, reason={}", 
                event.getOrderId(), event.getOrderNo(),
                event.getOldPaymentStatus(), event.getNewPaymentStatus(),
                event.getChangeReason());
        
        // 根据支付状态执行相应的业务逻辑
        switch (event.getNewPaymentStatus()) {
            case PAID:
                handlePaymentSuccess(event);
                break;
            case REFUNDED:
                handlePaymentRefunded(event);
                break;
            case UNPAID:
                handlePaymentPending(event);
                break;
            default:
                log.warn("未处理的支付状态: {}", event.getNewPaymentStatus());
        }
    }
    
    @Override
    public void onRefundStatusChanged(RefundStatusChangeEvent event) {
        log.info("处理退款状态变更事件: orderId={}, refundId={}, {} -> {}", 
                event.getOrderId(), event.getRefundId(),
                event.getOldRefundStatus(), event.getNewRefundStatus());
        
        // 可以在这里添加退款相关的业务逻辑
        // 比如发送通知、更新库存等
    }
    
    @Override
    public void onOrderStatusChanged(OrderStatusChangeEvent event) {
        log.info("处理订单状态变更事件: orderId={}, {} -> {}", 
                event.getOrderId(), event.getOldOrderStatus(), event.getNewOrderStatus());
        
        // 可以在这里添加订单状态相关的业务逻辑
        // 比如发送用户通知、触发后续流程等
    }
    
    /**
     * 处理支付成功事件
     */
    private void handlePaymentSuccess(PaymentStatusChangeEvent event) {
        log.info("处理支付成功: orderId={}", event.getOrderId());
        
        // 这里可以添加支付成功后的业务逻辑：
        // 1. 发送支付成功通知
        // 2. 更新商品库存
        // 3. 生成相关凭证
        // 4. 发送短信/邮件通知
        // 5. 启动履约流程
        
        // 示例：记录支付成功日志
        log.info("订单支付成功处理完成: orderId={}, changeTime={}", 
                event.getOrderId(), event.getChangeTime());
    }
    
    /**
     * 处理支付退款事件
     */
    private void handlePaymentRefunded(PaymentStatusChangeEvent event) {
        log.info("处理支付退款: orderId={}", event.getOrderId());
        
        // 这里可以添加支付退款后的业务逻辑：
        // 1. 恢复商品库存
        // 2. 取消相关服务
        // 3. 发送退款通知
        // 4. 更新会员积分
        
        // 示例：记录退款处理日志
        log.info("订单退款处理完成: orderId={}, changeTime={}", 
                event.getOrderId(), event.getChangeTime());
    }
    
    /**
     * 处理支付待处理事件
     */
    private void handlePaymentPending(PaymentStatusChangeEvent event) {
        log.info("处理支付待处理: orderId={}", event.getOrderId());
        
        // 这里可以添加支付待处理的业务逻辑：
        // 1. 设置支付超时提醒
        // 2. 预留库存
        // 3. 发送支付提醒
        
        // 示例：记录待支付处理日志
        log.info("订单待支付处理完成: orderId={}, changeTime={}", 
                event.getOrderId(), event.getChangeTime());
    }
}