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

const { resolveEnvApiKey, loadAuthProfileStoreForRuntime, listProfilesForProvider } = vi.hoisted(
  () => ({
    resolveEnvApiKey: vi.fn(),
    loadAuthProfileStoreForRuntime: vi.fn(),
    listProfilesForProvider: vi.fn(),
  }),
);

vi.mock("openclaw/plugin-sdk/provider-auth", () => ({
  resolveEnvApiKey,
}));

vi.mock("openclaw/plugin-sdk/agent-runtime", () => ({
  loadAuthProfileStoreForRuntime,
  listProfilesForProvider,
}));

import {
  defaultQaRuntimeModelForMode,
  resolveQaPreferredLiveModel,
} from "./model-selection.runtime.js";

describe("qa model selection runtime", () => {
  beforeEach(() => {
    vi.clearAllMocks();
    resolveEnvApiKey.mockReturnValue(undefined);
    loadAuthProfileStoreForRuntime.mockReturnValue({ profiles: {} });
    listProfilesForProvider.mockReturnValue([]);
  });

  it("keeps the OpenAI live default when an API key is configured", () => {
    resolveEnvApiKey.mockReturnValue({ apiKey: "sk-test" });

    expect(resolveQaPreferredLiveModel()).toBeUndefined();
    expect(defaultQaRuntimeModelForMode("live-frontier")).toBe("openai/gpt-5.4");
    expect(loadAuthProfileStoreForRuntime).not.toHaveBeenCalled();
  });

  it("prefers the Codex OAuth live default when only Codex auth profiles are available", () => {
    listProfilesForProvider.mockImplementation((_store: unknown, provider: string) =>
      provider === "openai-codex" ? ["openai-codex:user@example.com"] : [],
    );

    expect(resolveQaPreferredLiveModel()).toBe("openai-codex/gpt-5.4");
    expect(defaultQaRuntimeModelForMode("live-frontier")).toBe("openai-codex/gpt-5.4");
  });

  it("keeps the OpenAI live default when stored OpenAI profiles are available", () => {
    listProfilesForProvider.mockImplementation((_store: unknown, provider: string) =>
      provider === "openai" || provider === "openai-codex" ? [`${provider}:user@example.com`] : [],
    );

    expect(resolveQaPreferredLiveModel()).toBeUndefined();
    expect(defaultQaRuntimeModelForMode("live-frontier")).toBe("openai/gpt-5.4");
  });

  it("leaves mock-openai defaults unchanged", () => {
    listProfilesForProvider.mockImplementation((_store: unknown, provider: string) =>
      provider === "openai-codex" ? ["openai-codex:user@example.com"] : [],
    );

    expect(defaultQaRuntimeModelForMode("mock-openai")).toBe("mock-openai/gpt-5.4");
    expect(defaultQaRuntimeModelForMode("mock-openai", { alternate: true })).toBe(
      "mock-openai/gpt-5.4-alt",
    );
  });
});
