/**
 * Qwen (DashScope) 模型发现 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 = 'qwen3.5-plus'

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

const SEED_MODELS: ModelRecord[] = [
  buildGenericRecord('qwen3.5-plus', 'Qwen 3.5 Plus', 'qwen', 'Qwen', defaultCapabilities()),
  buildGenericRecord('qwen3.5-flash', 'Qwen 3.5 Flash', 'qwen', 'Qwen', defaultCapabilities()),
  buildGenericRecord('qwen3-coder-plus', 'Qwen3 Coder Plus', 'qwen', 'Qwen', defaultCapabilities()),
  buildGenericRecord('qwen-max', 'Qwen Max', 'qwen', 'Qwen', defaultCapabilities()),
  buildGenericRecord('qwen-plus', 'Qwen Plus', 'qwen', 'Qwen', defaultCapabilities()),
]

export class QwenAdapter implements ProviderAdapter {
  readonly providerId = 'qwen'
  readonly defaultBaseUrl = 'https://dashscope.aliyuncs.com/compatible-mode/v1'
  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 Qwen models: HTTP ${res.status}`)
    }
    const json = await res.json()
    const models = parseOpenAIModelsResponse(
      json as { data?: Array<{ id: string }> },
      'qwen',
      'Qwen',
      defaultCapabilities,
    )
    if (models.length === 0) {
      throw new Error('Qwen returned an empty model list')
    }
    return models
  }

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