/**
 * Zhipu (GLM) 模型发现 Adapter。
 */

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 = 'glm-5.2'

// 实测 open.bigmodel.cn/api/anthropic 对 thinking 的 enabled/adaptive/disabled
// 三态均正确执行（glm-5/glm-5.2 均返回 thinking block，disabled 不返回）。
const defaultCapabilities = (): ModelCapabilities => ({
  contextWindow: 128_000,
  maxOutputTokens: 4096,
  supportsVision: false,
  supportsThinking: true,
  supportsAdaptiveThinking: true,
  supportsEffort: false,
})

// 首次未刷新时的预览列表（仅 !apiKey 路径返回；刷新失败不会写进 DB）。
const SEED_MODELS: ModelRecord[] = [
  buildGenericRecord('glm-5.2', 'GLM-5.2', 'zhipu', 'GLM', defaultCapabilities()),
  buildGenericRecord('glm-5-turbo', 'GLM-5 Turbo', 'zhipu', 'GLM', defaultCapabilities()),
]

export class ZhipuAdapter implements ProviderAdapter {
  readonly providerId = 'zhipu'
  readonly defaultBaseUrl = 'https://open.bigmodel.cn/api/paas/v4'
  readonly authType = 'auth_token' as const

  async listModels(credential: ProviderCredential): Promise<ModelRecord[]> {
    const baseUrl = normalizeBaseUrl(credential.baseUrl, this.defaultBaseUrl)
    if (!credential.apiKey) return SEED_MODELS

    const res = await fetchWithTimeout(`${baseUrl}/models`, {
      headers: bearerHeaders(credential),
    })
    if (!res.ok) {
      throw new Error(`Failed to list Zhipu models: HTTP ${res.status}`)
    }
    const json = await res.json()
    const models = parseOpenAIModelsResponse(
      json as { data?: Array<{ id: string }> },
      'zhipu',
      'GLM',
      defaultCapabilities,
    )
    if (models.length === 0) {
      throw new Error('Zhipu returned an empty model list')
    }
    return models
  }

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