<?php

namespace App\Services;

use BsPaySdk\core\BsPayClient;
use BsPaySdk\request\V2TradeOnlinepaymentWappayRequest;
use BsPaySdk\request\V2TradePaymentJspayRequest;
use BsPaySdk\request\V2TradePaymentQueryRequest;
use BsPaySdk\request\V2TradePaymentRefundRequest;
use Illuminate\Support\Facades\Log;

class DgPayService
{
    protected BsPayClient $client;

    public function __construct()
    {
        // 加载SDK初始化文件
        require_once app_path('Support/BsPay/loader.php');
        $this->client = new BsPayClient();
    }

    /**
     * 创建支付订单
     */
    public function createOrder(string $orderNo, float $amount, string $subject, string $payType): array
    {
        try {
            // 根据支付方式选择对应的请求类
            $request = match ($payType) {
                'ALIPAY_H5', 'WECHAT_H5' => new V2TradeOnlinepaymentWappayRequest(),
                'ALIPAY_JSAPI', 'WECHAT_JSAPI' => new V2TradePaymentJspayRequest(),
                default => throw new \InvalidArgumentException('Unsupported pay type: ' . $payType),
            };

            // 设置请求参数
            $request->setReqDate(date('Ymd'));
            $request->setReqSeqId(date('YmdHis') . mt_rand(1000, 9999));
            $request->setTransAmt($amount);
            $request->setGoodsDesc($subject);
            // 其他参数

            // 调用接口
            $result = $this->client->postRequest($request);

            if (!$result || $result->isError()) {
                return [
                    'success' => false,
                    'message' => $result ? $result->getErrorInfo() : '支付失败'
                ];
            }

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

    /**
     * 查询订单
     */
    public function queryOrder(string $orderNo): array
    {
        try {
            $request = new V2TradePaymentJspayRequest();
            $request->setReqDate(date('Ymd'));
            $request->setReqSeqId(date('YmdHis') . mt_rand(1000, 9999));

            $result = $this->client->postRequest($request);

            if (!$result || $result->isError()) {
                return [
                    'success' => false,
                    'message' => $result ? $result->getErrorInfo() : '查询失败'
                ];
            }

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

    /**
     * 退款
     */
    public function refund(string $orderNo, string $refundNo, float $amount): array
    {
        try {
            $request = new V2TradePaymentJspayRequest();
            $request->setReqDate(date('Ymd'));
            $request->setReqSeqId(date('YmdHis') . mt_rand(1000, 9999));

            $result = $this->client->postRequest($request);

            if (!$result || $result->isError()) {
                return [
                    'success' => false,
                    'message' => $result ? $result->getErrorInfo() : '退款失败'
                ];
            }

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

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