<?php

namespace App\Services;

use BsPaySdk\core\BsPay;
use BsPaySdk\request\V2TradePaymentJspayRequest;
use BsPaySdk\request\V2TradePaymentScanpayRequest;
use BsPaySdk\request\V2TradePaymentWappayRequest;
use BsPaySdk\request\V2TradePaymentPayscanpayRequest;
use BsPaySdk\request\V2TradePaymentQueryRequest;
use BsPaySdk\request\V2TradePaymentRefundRequest;
use Illuminate\Support\Facades\Log;

class PaymentService
{
    public function __construct()
    {
        // 初始化SDK
        $config = array(
            'app_id' => config('dgpay.app_id'),
            'app_secret' => config('dgpay.app_secret'),
            'merchant_no' => config('dgpay.merchant_no'),
            'notify_url' => config('dgpay.notify_url'),
            'return_url' => config('dgpay.return_url'),
            'is_sandbox' => config('dgpay.is_sandbox'),
            'gateway' => config('dgpay.is_sandbox') ? config('dgpay.sandbox_gateway') : config('dgpay.gateway'),
        );

        BsPay::init($config);
    }

    /**
     * 创建支付订单
     *
     * @param string $orderNo 商户订单号
     * @param float $amount 支付金额
     * @param string $subject 商品标题
     * @param string $payType 支付方式:ALIPAY_H5/WECHAT_H5等
     * @return array
     */
    public function createOrder(string $orderNo, float $amount, string $subject, string $payType): array
    {
        try {
            $request = match ($payType) {
                'ALIPAY_H5', 'WECHAT_H5' => new V2TradePaymentWappayRequest(),
                'ALIPAY_JSAPI', 'WECHAT_JSAPI' => new V2TradePaymentJspayRequest(),
                'ALIPAY_NATIVE', 'WECHAT_NATIVE' => new V2TradePaymentScanpayRequest(),
                default => throw new \InvalidArgumentException('Unsupported pay type: ' . $payType),
            };

            $request->setOutOrderNo($orderNo);
            $request->setTransAmt($amount);
            $request->setGoodsDesc($subject);
            $request->setPayType($payType);

            $response = BsPay::request($request);

            if ($response->isSuccess()) {
                return [
                    'success' => true,
                    'data' => $response->getData()
                ];
            }

            return [
                'success' => false,
                'message' => $response->getMsg()
            ];
        } catch (\Exception $e) {
            Log::error('DgPay create order error: ' . $e->getMessage());
            return [
                'success' => false,
                'message' => $e->getMessage()
            ];
        }
    }

    /**
     * 查询订单
     *
     * @param string $orderNo 商户订单号
     * @return array
     */
    public function queryOrder(string $orderNo): array
    {
        try {
            $request = new V2TradePaymentQueryRequest();
            $request->setOutOrderNo($orderNo);

            $response = BsPay::request($request);

            if ($response->isSuccess()) {
                return [
                    'success' => true,
                    'data' => $response->getData()
                ];
            }

            return [
                'success' => false,
                'message' => $response->getMsg()
            ];
        } catch (\Exception $e) {
            Log::error('DgPay query order error: ' . $e->getMessage());
            return [
                'success' => false,
                'message' => $e->getMessage()
            ];
        }
    }

    /**
     * 退款
     *
     * @param string $orderNo 商户订单号
     * @param string $refundNo 退款单号
     * @param float $amount 退款金额
     * @return array
     */
    public function refund(string $orderNo, string $refundNo, float $amount): array
    {
        try {
            $request = new V2TradePaymentRefundRequest();
            $request->setOutOrderNo($orderNo);
            $request->setOutRefundNo($refundNo);
            $request->setRefundAmt($amount);

            $response = BsPay::request($request);

            if ($response->isSuccess()) {
                return [
                    'success' => true,
                    'data' => $response->getData()
                ];
            }

            return [
                'success' => false,
                'message' => $response->getMsg()
            ];
        } catch (\Exception $e) {
            Log::error('DgPay refund error: ' . $e->getMessage());
            return [
                'success' => false,
                'message' => $e->getMessage()
            ];
        }
    }

    /**
     * 验证签名
     *
     * @param array $data
     * @return bool
     */
    public function verifySign(array $data): bool
    {
        try {
            return BsPay::verifySign($data);
        } catch (\Exception $e) {
            Log::error('DgPay verify sign error: ' . $e->getMessage());
            return false;
        }
    }
}