import { completeSimple, getModel } from "@mariozechner/pi-ai";
import { Type } from "@sinclair/typebox";
import { describe, expect, it } from "vitest";
import { isTruthyEnvValue } from "../infra/env.js";
import { makeZeroUsageSnapshot } from "./usage.js";

const GEMINI_KEY = process.env.GEMINI_API_KEY ?? "";
const LIVE = isTruthyEnvValue(process.env.GEMINI_LIVE_TEST) || isTruthyEnvValue(process.env.LIVE);

const describeLive = LIVE && GEMINI_KEY ? describe : describe.skip;

describeLive("gemini live switch", () => {
  const googleModels = ["gemini-3-pro-preview", "gemini-2.5-pro"] as const;

  for (const modelId of googleModels) {
    it(`handles unsigned tool calls from Antigravity when switching to ${modelId}`, async () => {
      const now = Date.now();
      const model = getModel("google", modelId);

      const res = await completeSimple(
        model,
        {
          messages: [
            {
              role: "user",
              content: "Reply with ok.",
              timestamp: now,
            },
            {
              role: "assistant",
              content: [
                {
                  type: "toolCall",
                  id: "call_1",
                  name: "bash",
                  arguments: { command: "ls -la" },
                  // No thoughtSignature: simulates Claude via Antigravity.
                },
              ],
              api: "google-gemini-cli",
              provider: "google-antigravity",
              model: "claude-sonnet-4-20250514",
              usage: makeZeroUsageSnapshot(),
              stopReason: "stop",
              timestamp: now,
            },
          ],
          tools: [
            {
              name: "bash",
              description: "Run shell command",
              parameters: Type.Object({
                command: Type.String(),
              }),
            },
          ],
        },
        {
          apiKey: GEMINI_KEY,
          reasoning: "low",
          maxTokens: 128,
        },
      );

      expect(res.stopReason).not.toBe("error");
    }, 20000);
  }
});
