package com.ruoyi.database.controller;

import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.service.WxPayService;
import com.ruoyi.database.service.OrderService;
import com.ruoyi.database.service.WechatMiniProgramPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/wxpay")
public class WxPayNotifyController {

    @Autowired
    private WechatMiniProgramPayService wechatPayService;


    /**
     * 微信支付结果通知回调
     * 这个接口URL就是在创建订单时设置的 notifyUrl
     */
    @PostMapping("/notify")
    public String handleNotify(@RequestBody String xmlData) {
        try {
            System.out.println("========== 收到支付通知 ==========");
            System.out.println("通知数据: " + xmlData);

            // 1. 获取 wxPayService
            WxPayService wxPayService = wechatPayService.getWxPayService();

            // 2. 使用SDK解析并验证通知数据（SDK会自动验证签名）
            WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);

            // 3. 获取关键业务参数
            String orderId = notifyResult.getOutTradeNo();
            String transactionId = notifyResult.getTransactionId();
            Integer totalFee = notifyResult.getTotalFee();
            String timeEnd = notifyResult.getTimeEnd();

            System.out.println("解析通知数据: orderId=" + orderId +
                    ", transactionId=" + transactionId + ", totalFee=" + totalFee);

//            // 4. 幂等性处理：检查订单是否已处理
//            if (orderService.isOrderPaid(orderId)) {
//                System.out.println("订单已处理，直接返回成功");
//                return WxPayNotifyResponse.success("OK");
//            }
//
//            // 5. 校验订单金额（重要！防止资金损失）
//            if (!orderService.verifyOrderAmount(orderId, totalFee)) {
//                System.out.println("订单金额校验失败");
//                return WxPayNotifyResponse.fail("订单金额不一致");
//            }
//
//            // 6. 处理业务逻辑（更新订单状态等）
//            orderService.updateOrderToPaid(orderId, transactionId);

            System.out.println("支付通知处理成功");
            System.out.println("========== 支付通知处理完成 ==========");

            // 7. 返回成功响应（必须返回success）
            return WxPayNotifyResponse.success("OK");

        } catch (Exception e) {
            System.err.println("支付通知处理失败: " + e.getMessage());
            e.printStackTrace();
            return WxPayNotifyResponse.fail("处理失败");
        }
    }
}
