/**
 * MiniMax 模型发现 Adapter。
 *
 * MiniMax 没有稳定的标准 /v1/models 接口，discovery 以静态 SEED 为主：
 * - 有 key 且远程列表可用 → 使用 dynamic
 * - 有 key 但远程失败/空列表 → 回退 SEED 并视为成功（静态目录厂商）
 * - 无 key → 返回 SEED（供 getSeedModels）
 */

import type { ModelRecord, ProviderAdapter, ProviderCredential, ConnectionTestResult, ModelCapabilities } from '../types'
import { PROVIDER_CATALOG } from '../catalog'
import {
  buildGenericRecord,
  fetchWithTimeout,
  bearerHeaders,
  normalizeBaseUrl,
  parseOpenAIModelsResponse,
  testAnthropicCompatibleConnection,
} from './common'

const PROBE_MODEL = 'MiniMax-M3'

const defaultCapabilities = (): ModelCapabilities => ({
  contextWindow: 200_000,
  maxOutputTokens: 4096,
  supportsVision: false,
  supportsThinking: false,
  supportsAdaptiveThinking: false,
  supportsEffort: false,
})

const minimaxCapabilities = (id: string): ModelCapabilities => {
  const base = defaultCapabilities()
  const isFast = id.includes('highspeed')
  // 实测 api.minimaxi.com/anthropic 对 thinking 的 enabled/adaptive/disabled
  // 三态均正确执行，含 MiniMax-M3（原误标为唯一不支持，已纠正）。
  return {
    ...base,
    supportsThinking: true,
    supportsAdaptiveThinking: true,
    supportsFastMode: isFast || undefined,
  }
}

// 静态目录：MiniMax 远程 /models 不可靠时作为权威列表写库。
const SEED_MODELS: ModelRecord[] = [
  buildGenericRecord('MiniMax-M3', 'MiniMax M3', 'minimax', 'MiniMax', minimaxCapabilities('MiniMax-M3')),
  buildGenericRecord('MiniMax-M2.7', 'MiniMax M2.7', 'minimax', 'MiniMax', minimaxCapabilities('MiniMax-M2.7')),
]

export class MiniMaxAdapter implements ProviderAdapter {
  readonly providerId = 'minimax'
  readonly defaultBaseUrl = 'https://api.minimaxi.com/v1'
  readonly authType = 'auth_token' as const

  async listModels(credential: ProviderCredential): Promise<ModelRecord[]> {
    if (!credential.apiKey) return SEED_MODELS
    const baseUrl = normalizeBaseUrl(credential.baseUrl, this.defaultBaseUrl)
    try {
      const res = await fetchWithTimeout(`${baseUrl}/models`, {
        headers: bearerHeaders(credential),
      })
      if (!res.ok) {
        // 无可靠 list API：静态 SEED 视为成功发现，避免刷新永远失败
        return SEED_MODELS.map((m) => ({ ...m, source: 'seed' as const }))
      }
      const json = await res.json()
      const models = parseOpenAIModelsResponse(
        json as { data?: Array<{ id: string }> },
        'minimax',
        'MiniMax',
        minimaxCapabilities,
      )
      if (models.length === 0) {
        return SEED_MODELS.map((m) => ({ ...m, source: 'seed' as const }))
      }
      return models
    } catch {
      return SEED_MODELS.map((m) => ({ ...m, source: 'seed' as const }))
    }
  }

  async testConnection(credential: ProviderCredential): Promise<ConnectionTestResult> {
    return testAnthropicCompatibleConnection({
      baseUrl: PROVIDER_CATALOG.minimax.anthropicBaseUrl,
      apiKey: credential.apiKey,
      model: PROBE_MODEL,
    })
  }
}
