<?php

namespace HaoZiTeam\AIPost\Service\Features;

defined('ABSPATH') || exit;

/**
 * 文心一言（千帆）模型能力目录：提供每个模型的最大输出限制与优势描述。
 * 注意：max_output_tokens 官方文档常见可配范围为 2-2048（不同模型/时期可能调整）。
 * 这里采用稳健的上限 2048，并预留占位，后续可根据官方文档更新。
 */
class WenXinModelCatalog
{
    /**
     * 获取模型能力映射表。
     * key: 账户设置中使用的小写模型名（与 Setting.php 选项一致）
     */
    public static function get(): array
    {
        return [
            'ernie-4.0-8k' => [
                'display' => 'ERNIE-4.0-8K（推荐）',
                'max_output_tokens' => 2048,
                'advantages' => '综合能力最强，推理创作更可靠；约8K上下文，适合高质量长文生成。',
            ],
            'ernie-4.5-turbo-128k-preview' => [
                'display' => 'ERNIE-4.5-Turbo-128K（预览）',
                'max_output_tokens' => 2048,
                'advantages' => '更大上下文（128K），适合超长素材整合、长文/长对话场景。',
            ],
            'ernie-3.5-8k' => [
                'display' => 'ERNIE-3.5-8K（均衡）',
                'max_output_tokens' => 2048,
                'advantages' => '成本与效果均衡，适合日常内容生成与改写。',
            ],
            'ernie-speed-8k' => [
                'display' => 'ERNIE-Speed-8K（更快）',
                'max_output_tokens' => 2048,
                'advantages' => '响应更快，适合批量生产与对实时性要求较高的场景。',
            ],
            'ernie-lite-8k' => [
                'display' => 'ERNIE-Lite-8K（轻量）',
                'max_output_tokens' => 2048,
                'advantages' => '轻量高效，性价比优，适合简单长文或摘要改写。',
            ],
            'ernie-x1-turbo-32k' => [
                'display' => 'ERNIE-X1-Turbo-32K',
                'max_output_tokens' => 2048,
                'advantages' => '更强推理/生成能力与较大上下文（32K），适合复杂写作与多轮指令。',
            ],
            'ernie-x1.1-preview' => [
                'display' => 'ERNIE-X1.1（预览）',
                'max_output_tokens' => 2048,
                'advantages' => '新版本预览模型，适合尝鲜与对比效果（以账号开通为准）。',
            ],
            'ernie-5.0-thinking-preview' => [
                'display' => 'ERNIE-5.0-Thinking（预览）',
                'max_output_tokens' => 2048,
                'advantages' => '思考/推理增强预览模型，适合需要更强分析与规划的内容生成。',
            ],

            'deepseek-v3.2' => [
                'display' => 'DeepSeek-V3.2',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。适合通用写作与对话（以账号开通为准）。',
            ],
            'deepseek-v3' => [
                'display' => 'DeepSeek-V3',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。适合通用写作与对话（以账号开通为准）。',
            ],
            'deepseek-v3.1' => [
                'display' => 'DeepSeek-V3.1',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。适合通用写作与对话（以账号开通为准）。',
            ],

            'qwen3-coder-30b-a3b-instruct' => [
                'display' => 'Qwen3-Coder-30B-A3B-Instruct',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。偏代码/指令场景（以账号开通为准）。',
            ],
            'qwen3-coder-480b-a35b-instruct' => [
                'display' => 'Qwen3-Coder-480B-A35B-Instruct',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。偏代码/指令场景（以账号开通为准）。',
            ],

            'kimi-k2-instruct' => [
                'display' => 'Kimi-K2-Instruct',
                'max_output_tokens' => 2048,
                'advantages' => '第三方模型（千帆接入点）。适合指令跟随与内容生成（以账号开通为准）。',
            ],
        ];
    }

    /**
     * 根据模型名获取最大输出上限。
     */
    public static function maxOutputFor(string $model): int
    {
        $m = strtolower(trim($model));
        $map = self::get();
        if (isset($map[$m]['max_output_tokens'])) {
            return (int) $map[$m]['max_output_tokens'];
        }
        // 未知模型：回退到安全上限 2048
        return 2048;
    }

    /**
     * 生成设置页下拉选项：将最大输出与优势拼入展示文本。
     */
    public static function optionsForSelect(): array
    {
        $opts = [];
        foreach (self::get() as $key => $info) {
            $label = $info['display'];
            $max = (int) ($info['max_output_tokens'] ?? 2048);
            $adv = (string) ($info['advantages'] ?? '');
            $opts[$key] = sprintf('%s｜最大输出≈%d tokens｜%s', $label, $max, $adv);
        }
        return $opts;
    }
}
