<?php

/**
 * 文件功能：后台 VIP 支付配置控制器
 * 用于管理聊天室对接 NovaLink 支付中心所需的开关、地址、App Key 与 App Secret
 */

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\UpdateVipPaymentConfigRequest;
use App\Models\SysParam;
use App\Services\ChatStateService;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;

class VipPaymentConfigController extends Controller
{
    /**
     * 构造函数注入聊天室状态服务
     *
     * @param  ChatStateService  $chatState  系统参数缓存同步服务
     */
    public function __construct(
        private readonly ChatStateService $chatState,
    ) {}

    /**
     * 显示 VIP 支付配置页
     */
    public function edit(): View
    {
        $aliases = array_keys($this->fieldDescriptions());

        // 仅读取 VIP 支付专属配置，避免与系统参数页重复展示。
        $params = SysParam::query()
            ->whereIn('alias', $aliases)
            ->pluck('body', 'alias')
            ->toArray();

        return view('admin.vip-payment.config', [
            'params' => $params,
            'descriptions' => $this->fieldDescriptions(),
        ]);
    }

    /**
     * 保存 VIP 支付配置并刷新缓存
     *
     * @param  UpdateVipPaymentConfigRequest  $request  已校验的后台配置请求
     */
    public function update(UpdateVipPaymentConfigRequest $request): RedirectResponse
    {
        $data = $request->validated();
        $descriptions = $this->fieldDescriptions();

        foreach ($descriptions as $alias => $guidetxt) {
            $body = (string) ($data[$alias] ?? '');

            // 写入数据库并同步描述文案，确保后续后台与缓存读取一致。
            SysParam::updateOrCreate(
                ['alias' => $alias],
                ['body' => $body, 'guidetxt' => $guidetxt]
            );

            $this->chatState->setSysParam($alias, $body);
            SysParam::clearCache($alias);
        }

        return redirect()->route('admin.vip-payment.edit')->with('success', 'VIP 支付配置已成功保存。');
    }

    /**
     * 返回 VIP 支付字段说明文案
     *
     * @return array<string, string>
     */
    private function fieldDescriptions(): array
    {
        return [
            'vip_payment_enabled' => 'VIP 在线支付开关（1=开启，0=关闭）',
            'vip_payment_base_url' => 'NovaLink 支付中心地址（例如 https://novalink.test）',
            'vip_payment_app_key' => 'NovaLink 支付中心 App Key',
            'vip_payment_app_secret' => 'NovaLink 支付中心 App Secret',
            'vip_payment_timeout' => '调用支付中心超时时间（秒）',
        ];
    }
}
