/**
 * Single source of truth for built-in model definitions.
 *
 * Add new models HERE — all UI components and server logic
 * consume from this file. No more duplicate hardcoded arrays.
 */

import type { ModelCapabilities } from './engine/model-registry/types'

export interface ModelEntry {
  id: string
  label: string
  provider: string      // Display name: 'Anthropic', 'Moonshot', etc.
  providerId: string    // DB provider ID: 'anthropic', 'moonshot', etc.
  aliases?: string[]    // For IM /model fuzzy matching
  capabilities?: ModelCapabilities // 能力元数据（thinking/effort/vision/fast）
  status?: 'available' | 'unavailable'
}

/**
 * 国产 Anthropic-compatible 厂商通用思考能力。
 * 实测 GLM/Kimi/DeepSeek/MiniMax 的 Anthropic 端点对 thinking 的
 * enabled/adaptive/disabled 三态均正确执行，故默认开放思考。
 */
const THINKING_CAPS: ModelCapabilities = {
  supportsThinking: true,
  supportsAdaptiveThinking: true,
  supportsEffort: false,
  supportsVision: false,
}

/**
 * Built-in models. These are always available regardless of DB state.
 * Custom provider models are loaded dynamically from the database.
 */
export const BUILTIN_MODELS: ModelEntry[] = [
  // Anthropic (native)
  { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', provider: 'Anthropic', providerId: 'anthropic', aliases: ['sonnet', 'claude-sonnet'] },
  { id: 'claude-opus-4-6', label: 'Claude Opus 4.6', provider: 'Anthropic', providerId: 'anthropic', aliases: ['opus', 'claude-opus'] },
  { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', provider: 'Anthropic', providerId: 'anthropic', aliases: ['haiku', 'claude-haiku'] },
  // Moonshot/Kimi (Anthropic-compatible) — 实测 supportsThinking/adaptive 生效
  { id: 'kimi-k2.6', label: 'Kimi K2.6', provider: 'Moonshot', providerId: 'moonshot', aliases: ['kimi'], capabilities: THINKING_CAPS },
  { id: 'kimi-k2.5', label: 'Kimi K2.5', provider: 'Moonshot', providerId: 'moonshot', aliases: ['kimi-k2.5'], capabilities: THINKING_CAPS },
  // Zhipu/GLM (Anthropic-compatible) — 实测 supportsThinking/adaptive 生效
  { id: 'glm-5.2', label: 'GLM-5.2', provider: 'Zhipu', providerId: 'zhipu', aliases: ['glm', 'glm5'], capabilities: THINKING_CAPS },
  { id: 'glm-5', label: 'GLM-5', provider: 'Zhipu', providerId: 'zhipu', aliases: ['glm5'], capabilities: THINKING_CAPS },
  { id: 'glm-5-turbo', label: 'GLM-5 Turbo', provider: 'Zhipu', providerId: 'zhipu', aliases: ['glm5-turbo'], capabilities: THINKING_CAPS },
  // MiniMax (Anthropic-compatible) — 实测 supportsThinking/adaptive 生效（含 M3）
  { id: 'MiniMax-M3', label: 'MiniMax M3', provider: 'MiniMax', providerId: 'minimax', aliases: ['minimax', 'm3'], capabilities: THINKING_CAPS },
  { id: 'MiniMax-M2.7', label: 'MiniMax M2.7', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2.7'], capabilities: THINKING_CAPS },
  { id: 'MiniMax-M2.7-highspeed', label: 'MiniMax M2.7 Highspeed', provider: 'MiniMax', providerId: 'minimax', aliases: ['minimax-fast'], capabilities: { ...THINKING_CAPS, supportsFastMode: true } },
  { id: 'MiniMax-M2.5', label: 'MiniMax M2.5', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2.5'], capabilities: THINKING_CAPS },
  { id: 'MiniMax-M2.5-highspeed', label: 'MiniMax M2.5 Highspeed', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2.5-fast'], capabilities: { ...THINKING_CAPS, supportsFastMode: true } },
  { id: 'MiniMax-M2.1', label: 'MiniMax M2.1', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2.1'], capabilities: THINKING_CAPS },
  { id: 'MiniMax-M2.1-highspeed', label: 'MiniMax M2.1 Highspeed', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2.1-fast'], capabilities: { ...THINKING_CAPS, supportsFastMode: true } },
  { id: 'MiniMax-M2', label: 'MiniMax M2', provider: 'MiniMax', providerId: 'minimax', aliases: ['m2'], capabilities: THINKING_CAPS },
  // Qwen/DashScope (Anthropic-compatible)
  { id: 'qwen3.5-plus', label: 'Qwen 3.5 Plus', provider: 'Qwen', providerId: 'qwen', aliases: ['qwen', 'qwen3.5'] },
  { id: 'qwen3.5-flash', label: 'Qwen 3.5 Flash', provider: 'Qwen', providerId: 'qwen', aliases: ['qwen-flash'] },
  { id: 'qwen3-coder-plus', label: 'Qwen3 Coder Plus', provider: 'Qwen', providerId: 'qwen', aliases: ['qwen-coder'] },
  { id: 'qwen-max', label: 'Qwen Max', provider: 'Qwen', providerId: 'qwen', aliases: ['qwen-max'] },
  { id: 'qwen-plus', label: 'Qwen Plus', provider: 'Qwen', providerId: 'qwen', aliases: ['qwen-plus'] },
  // DeepSeek (Anthropic-compatible)
  { id: 'deepseek-v4-flash', label: 'DeepSeek V4 Flash', provider: 'DeepSeek', providerId: 'deepseek', aliases: ['deepseek-flash', 'ds-flash'], capabilities: { supportsThinking: true, supportsAdaptiveThinking: true, supportsEffort: false, supportsVision: false, contextWindow: 1_000_000, maxOutputTokens: 32_768 } },
  { id: 'deepseek-v4-pro', label: 'DeepSeek V4 Pro', provider: 'DeepSeek', providerId: 'deepseek', aliases: ['deepseek-pro', 'ds-pro'], capabilities: { supportsThinking: true, supportsAdaptiveThinking: true, supportsEffort: false, supportsVision: false, contextWindow: 1_000_000, maxOutputTokens: 32_768 } },
]

/**
 * Build MODEL_TO_PROVIDER mapping from BUILTIN_MODELS.
 * Used by resolveProvider() for fast model → provider lookup.
 */
export const MODEL_TO_PROVIDER: Record<string, string> = Object.fromEntries(
  BUILTIN_MODELS.map(m => [m.id, m.providerId])
)
