import { describe, expect, it, mock } from "bun:test"

import { refreshModelCapabilities } from "./refresh-model-capabilities"

describe("refreshModelCapabilities", () => {
  it("uses config source_url when CLI override is absent", async () => {
    const loadConfig = mock(() => ({
      model_capabilities: {
        source_url: "https://mirror.example/api.json",
      },
    }))
    const refreshCache = mock(async () => ({
      generatedAt: "2026-03-25T00:00:00.000Z",
      sourceUrl: "https://mirror.example/api.json",
      models: {
        "gpt-5.4": { id: "gpt-5.4" },
      },
    }))
    let stdout = ""

    const exitCode = await refreshModelCapabilities(
      { directory: "/repo", json: false },
      {
        loadConfig,
        refreshCache,
        stdout: {
          write: (chunk: string) => {
            stdout += chunk
            return true
          },
        } as never,
        stderr: {
          write: () => true,
        } as never,
      },
    )

    expect(exitCode).toBe(0)
    expect(loadConfig).toHaveBeenCalledWith("/repo", null)
    expect(refreshCache).toHaveBeenCalledWith({
      sourceUrl: "https://mirror.example/api.json",
    })
    expect(stdout).toContain("Refreshed model capabilities cache (1 models)")
  })

  it("CLI sourceUrl overrides config and supports json output", async () => {
    const refreshCache = mock(async () => ({
      generatedAt: "2026-03-25T00:00:00.000Z",
      sourceUrl: "https://override.example/api.json",
      models: {
        "gpt-5.4": { id: "gpt-5.4" },
        "claude-opus-4-7": { id: "claude-opus-4-7" },
      },
    }))
    let stdout = ""

    const exitCode = await refreshModelCapabilities(
      {
        directory: "/repo",
        json: true,
        sourceUrl: "https://override.example/api.json",
      },
      {
        loadConfig: () => ({}),
        refreshCache,
        stdout: {
          write: (chunk: string) => {
            stdout += chunk
            return true
          },
        } as never,
        stderr: {
          write: () => true,
        } as never,
      },
    )

    expect(exitCode).toBe(0)
    expect(refreshCache).toHaveBeenCalledWith({
      sourceUrl: "https://override.example/api.json",
    })
    expect(JSON.parse(stdout)).toEqual({
      sourceUrl: "https://override.example/api.json",
      generatedAt: "2026-03-25T00:00:00.000Z",
      modelCount: 2,
    })
  })

  it("returns exit code 1 when refresh fails", async () => {
    let stderr = ""

    const exitCode = await refreshModelCapabilities(
      { directory: "/repo" },
      {
        loadConfig: () => ({}),
        refreshCache: async () => {
          throw new Error("boom")
        },
        stdout: {
          write: () => true,
        } as never,
        stderr: {
          write: (chunk: string) => {
            stderr += chunk
            return true
          },
        } as never,
      },
    )

    expect(exitCode).toBe(1)
    expect(stderr).toContain("Failed to refresh model capabilities cache")
  })
})
