import { describe, expect, it } from "vitest";
import type { OpenClawConfig } from "../config/config.js";
import type { ModelDefinitionConfig } from "../config/types.models.js";
import { installModelsConfigTestHooks, withModelsTempHome } from "./models-config.e2e-harness.js";
import { ensureOpenClawModelsJson } from "./models-config.js";
import { readGeneratedModelsJson } from "./models-config.test-utils.js";

function createGoogleModelsConfig(models: ModelDefinitionConfig[]): OpenClawConfig {
  return {
    models: {
      providers: {
        google: {
          baseUrl: "https://generativelanguage.googleapis.com/v1beta",
          apiKey: "GEMINI_KEY", // pragma: allowlist secret
          api: "google-generative-ai",
          models,
        },
      },
    },
  };
}

async function expectGeneratedGoogleModelIds(ids: string[]) {
  const parsed = await readGeneratedModelsJson<{
    providers: Record<string, { models: Array<{ id: string }> }>;
  }>();
  expect(parsed.providers.google?.models?.map((model) => model.id)).toEqual(ids);
}

describe("models-config", () => {
  installModelsConfigTestHooks();

  it("normalizes gemini 3 ids to preview for google providers", async () => {
    await withModelsTempHome(async () => {
      const cfg = createGoogleModelsConfig([
        {
          id: "gemini-3-pro",
          name: "Gemini 3 Pro",
          api: "google-generative-ai",
          reasoning: true,
          input: ["text", "image"],
          cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
          contextWindow: 1048576,
          maxTokens: 65536,
        },
        {
          id: "gemini-3-flash",
          name: "Gemini 3 Flash",
          api: "google-generative-ai",
          reasoning: false,
          input: ["text", "image"],
          cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
          contextWindow: 1048576,
          maxTokens: 65536,
        },
      ]);

      await ensureOpenClawModelsJson(cfg);
      await expectGeneratedGoogleModelIds(["gemini-3-pro-preview", "gemini-3-flash-preview"]);
    });
  });

  it("normalizes the deprecated google flash preview id to the working preview id", async () => {
    await withModelsTempHome(async () => {
      const cfg = createGoogleModelsConfig([
        {
          id: "gemini-3.1-flash-preview",
          name: "Gemini 3.1 Flash Preview",
          api: "google-generative-ai",
          reasoning: false,
          input: ["text", "image"],
          cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
          contextWindow: 1048576,
          maxTokens: 65536,
        },
      ]);

      await ensureOpenClawModelsJson(cfg);
      await expectGeneratedGoogleModelIds(["gemini-3-flash-preview"]);
    });
  });
});
