<?php

/**
 * 文件功能：后台等级经验阈值配置控制器
 *
 * 将 sysparam 表中的 levelexp 配置拆分为独立后台页面，
 * 以列表模式维护每一级所需的累计经验值。
 */

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\UpdateLevelExpConfigRequest;
use App\Models\Sysparam;
use App\Services\ChatStateService;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;

/**
 * 类功能：负责展示和保存等级经验阈值列表。
 */
class LevelExpConfigController extends Controller
{
    /**
     * 方法功能：注入系统参数缓存同步服务。
     */
    public function __construct(
        private readonly ChatStateService $chatState
    ) {}

    /**
     * 方法功能：显示等级经验阈值列表页。
     */
    public function index(): View
    {
        $rawThresholds = Sysparam::getLevelExpThresholds();
        $maxLevel = (int) Sysparam::getValue('maxlevel', '99');

        $thresholds = collect($rawThresholds)
            ->values()
            ->map(fn (int $exp, int $index): array => [
                'level' => $index + 1,
                'exp' => $exp,
                'increment' => $index === 0 ? $exp : $exp - $rawThresholds[$index - 1],
            ]);

        return view('admin.level-exp-configs.index', [
            'thresholds' => $thresholds,
            'maxLevel' => $maxLevel,
        ]);
    }

    /**
     * 方法功能：保存等级经验阈值配置，并同步刷新缓存。
     */
    public function update(UpdateLevelExpConfigRequest $request): RedirectResponse
    {
        $thresholds = $request->validated('thresholds');

        // 将列表页提交的阈值重新拼成兼容旧逻辑的逗号字符串。
        $body = implode(',', $thresholds);

        Sysparam::updateOrCreate(
            ['alias' => 'levelexp'],
            [
                'body' => $body,
                'guidetxt' => '按列表逐级维护升级所需的累计经验阈值',
            ]
        );

        // 同步更新 Redis / Cache，确保前台经验等级计算即时生效。
        $this->chatState->setSysParam('levelexp', $body);
        Sysparam::clearCache('levelexp');

        return redirect()->route('admin.level-exp-configs.index')->with('success', '等级经验阈值已保存并生效！');
    }
}
