<?php

namespace Kylin\Payment\Services;

use Illuminate\Support\Facades\Log;
use Kylin\Payment\Payment;
use Illuminate\Contracts\Container\Container;

/**
 * 支付链接生成服务类
 */
class PaymentLinkService
{
    /**
     * 构造函数
     */
    public function __construct(
        protected readonly Container $app,
        protected readonly TestToolService $testToolService,
        protected readonly Payment $payment
    ) {
    }

    /**
     * 生成支付链接
     */
    public function generate(string $type, array $params, string $name = 'default', array $options = []): string
    {
        $defaultOptions = [
            'return_url' => '',
            'notify_url' => '',
            'expire_time' => 3600,
            'redirect' => true,
        ];

        $options = array_merge($defaultOptions, $options);

        try {
            // 生成支付参数
            $testParams = $this->testToolService->generateTestParams($type, $params);

            // 添加额外参数
            if (!empty($options['return_url'])) {
                $testParams['return_url'] = $options['return_url'];
            }
            if (!empty($options['notify_url'])) {
                $testParams['notify_url'] = $options['notify_url'];
            }
            if (!empty($options['expire_time'])) {
                $testParams['expire_time'] = $options['expire_time'];
            }

            // 获取支付网关
            $gateway = $this->payment->manager()->gateway($type, $name);

            // 发起支付获取支付链接
            $result = $gateway->pay($testParams);

            // 提取支付链接
            $paymentLink = $this->extractPaymentLink($type, $result);

            if (empty($paymentLink)) {
                return '';
            }

            // 如果需要重定向，生成重定向链接
            if ($options['redirect']) {
                return $this->generateRedirectLink($paymentLink, $options);
            }

            return $paymentLink;
        } catch (\Exception $e) {
            Log::error('生成支付链接失败', [
                'type' => $type,
                'params' => $params,
                'options' => $options,
                'error' => $e->getMessage(),
            ]);
            return '';
        }
    }

    /**
     * 提取支付链接
     */
    protected function extractPaymentLink(string $type, mixed $result): string
    {
        return match ($type) {
            'wechat' => $result['code_url'] ?? $result['mweb_url'] ?? '',
            'alipay' => $result['trade_no'] ?? $result['qr_code'] ?? '',
            'unionpay' => $result['qrCode'] ?? $result['tn'] ?? '',
            'douyin' => $result['code_url'] ?? $result['pay_url'] ?? '',
            'jsbank' => $result['qrCode'] ?? $result['pay_url'] ?? '',
            'alipay_global' => $result['trade_no'] ?? $result['qr_code'] ?? '',
            'paypal' => $result['approval_url'] ?? '',
            'stripe' => $result['url'] ?? '',
            'google_pay' => $result['payment_url'] ?? '',
            'apple_pay' => $result['payment_url'] ?? '',
            default => '',
        };
    }

    /**
     * 生成重定向链接
     */
    protected function generateRedirectLink(string $paymentLink, array $options = []): string
    {
        // 这里可以根据需要生成重定向链接
        // 例如，生成一个内部路由，然后重定向到支付链接
        $redirectUrl = route('kylin.payment.redirect', [
            'url' => urlencode($paymentLink),
            'expire' => time() + ($options['expire_time'] ?? 3600),
        ]);

        Log::info('生成重定向链接', [
            'payment_link' => $paymentLink,
            'redirect_url' => $redirectUrl,
        ]);

        return $redirectUrl;
    }

    /**
     * 生成微信支付链接
     */
    public function generateWechatLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('wechat', $params, $name, $options);
    }

    /**
     * 生成支付宝链接
     */
    public function generateAlipayLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('alipay', $params, $name, $options);
    }

    /**
     * 生成银联支付链接
     */
    public function generateUnionpayLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('unionpay', $params, $name, $options);
    }

    /**
     * 生成抖音支付链接
     */
    public function generateDouyinLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('douyin', $params, $name, $options);
    }

    /**
     * 生成江苏银行支付链接
     */
    public function generateJsbankLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('jsbank', $params, $name, $options);
    }

    /**
     * 生成支付宝国际版链接
     */
    public function generateAlipayGlobalLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('alipay_global', $params, $name, $options);
    }

    /**
     * 生成PayPal链接
     */
    public function generatePaypalLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('paypal', $params, $name, $options);
    }

    /**
     * 生成Stripe链接
     */
    public function generateStripeLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('stripe', $params, $name, $options);
    }

    /**
     * 生成Google Pay链接
     */
    public function generateGooglePayLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('google_pay', $params, $name, $options);
    }

    /**
     * 生成Apple Pay链接
     */
    public function generateApplePayLink(array $params, string $name = 'default', array $options = []): string
    {
        return $this->generate('apple_pay', $params, $name, $options);
    }

    /**
     * 验证支付链接
     */
    public function validateLink(?string $link, array $options = []): bool
    {
        // 检查链接是否为空
        if (empty($link)) {
            return false;
        }

        // 检查链接是否过期
        if (isset($options['expire']) && $options['expire'] < time()) {
            return false;
        }

        // 检查链接格式
        if (!filter_var($link, FILTER_VALIDATE_URL)) {
            return false;
        }

        return true;
    }

    /**
     * 处理支付链接重定向
     */
    public function handleRedirect(string $link, array $options = []): mixed
    {
        // 验证链接
        if (!$this->validateLink($link, $options)) {
            return redirect()->back()->withErrors('无效的支付链接');
        }

        // 重定向到支付链接
        return redirect()->to($link);
    }
}