package com.ruoyi.database.service;

import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeCreateModel;
import com.alipay.api.request.AlipayTradeCreateRequest;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.ruoyi.config.AlipayRYConfig;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class AlipayService {

    private final AlipayRYConfig alipayRYConfig;


    public AlipayService(AlipayRYConfig alipayRYConfig) {
        this.alipayRYConfig = alipayRYConfig;
    }

    /**
     * 创建支付宝小程序支付订单
     *
     * @param orderId 商户订单号
     * @param amount  支付金额（单位：元）
     * @param subject 订单标题
     * @param buyerId 支付宝用户ID（相当于OpenID）
     * @return 支付订单字符串，用于小程序前端调起支付
     */
    public Map<String, Object> createOrder(String orderId, String amount, String subject, String buyerId) {
        try {
            AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
            // 构造请求参数以调用接口
            AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
            AlipayTradeCreateModel model = new AlipayTradeCreateModel();
            // 设置商户订单号
            model.setOutTradeNo(orderId);
            // 设置产品码
            model.setProductCode("JSAPI_PAY");
            // 设置小程序支付中
            model.setOpAppId(alipayRYConfig.appId);
            // 设置订单总金额
            model.setTotalAmount(amount);
            // 设置订单标题
            model.setSubject(subject);
            // 设置订单附加信息
            model.setBody(subject);
            // 设置买家支付宝用户唯一标识
            model.setBuyerOpenId(buyerId);
            request.setBizModel(model);
            AlipayTradeCreateResponse response = alipayClient.execute(request);
            System.out.println(response.getBody());
            // 5. 处理响应
            if (response.isSuccess()) {
                System.out.println("支付宝预下单成功，交易号: " + response.getTradeNo());
                // 返回给前端的订单字符串，用于调起支付
                Map<String, Object> maps = new HashMap<>();
                maps.put("success", response.isSuccess());
                maps.put("tradeNO", response.getTradeNo());
                maps.put("outTradeNo", response.getOutTradeNo());
                return maps;
//                return response.getOutTradeNo();
                // 注意：在实际开发中，你可能需要返回一个包含更多信息的对象或重新构造一个支付参数字符串。
                // 具体返回格式需与前端调用 my.tradePay 时所需的参数保持一致。
            } else {
                System.err.println("支付宝预下单失败: " + response.getMsg() + " - " + response.getSubMsg());
                throw new RuntimeException("支付宝预下单失败");
            }
        } catch (Exception e) {
            throw new RuntimeException("调用支付宝接口异常", e);
        }

    }

    private AlipayConfig getAlipayConfig() {
        AlipayConfig alipayConfig = new AlipayConfig();
        alipayConfig.setServerUrl(alipayRYConfig.gateway);
        alipayConfig.setAppId(alipayRYConfig.appId);
        alipayConfig.setPrivateKey(alipayRYConfig.privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayRYConfig.alipayPublicKey);
        alipayConfig.setCharset("UTF-8");
        alipayConfig.setSignType("RSA2");
        return alipayConfig;
    }
}
