import { describe, expect, it } from "vitest";

import type { ClawdisConfig } from "../config/config.js";
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./defaults.js";
import { resolveConfiguredModelRef } from "./model-selection.js";

describe("resolveConfiguredModelRef", () => {
  it("parses provider/model from agent.model", () => {
    const cfg = {
      agent: { model: "openai/gpt-4.1-mini" },
    } satisfies ClawdisConfig;

    const resolved = resolveConfiguredModelRef({
      cfg,
      defaultProvider: DEFAULT_PROVIDER,
      defaultModel: DEFAULT_MODEL,
    });

    expect(resolved).toEqual({ provider: "openai", model: "gpt-4.1-mini" });
  });

  it("falls back to anthropic when agent.model omits provider", () => {
    const cfg = {
      agent: { model: "claude-opus-4-5" },
    } satisfies ClawdisConfig;

    const resolved = resolveConfiguredModelRef({
      cfg,
      defaultProvider: DEFAULT_PROVIDER,
      defaultModel: DEFAULT_MODEL,
    });

    expect(resolved).toEqual({
      provider: "anthropic",
      model: "claude-opus-4-5",
    });
  });

  it("falls back to defaults when agent.model is missing", () => {
    const cfg = {} satisfies ClawdisConfig;

    const resolved = resolveConfiguredModelRef({
      cfg,
      defaultProvider: DEFAULT_PROVIDER,
      defaultModel: DEFAULT_MODEL,
    });

    expect(resolved).toEqual({
      provider: DEFAULT_PROVIDER,
      model: DEFAULT_MODEL,
    });
  });

  it("resolves agent.model aliases when configured", () => {
    const cfg = {
      agent: {
        model: "Opus",
        modelAliases: {
          Opus: "anthropic/claude-opus-4-5",
        },
      },
    } satisfies ClawdisConfig;

    const resolved = resolveConfiguredModelRef({
      cfg,
      defaultProvider: DEFAULT_PROVIDER,
      defaultModel: DEFAULT_MODEL,
    });

    expect(resolved).toEqual({
      provider: "anthropic",
      model: "claude-opus-4-5",
    });
  });
});
