/**
 * Smoke test for the Antigravity extension.
 *
 * Run from the repo root (after /login google-antigravity):
 *   npx tsx packages/coding-agent/examples/extensions/google-antigravity/test.ts
 */
import { readFileSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai";
import { STATIC_PROVIDER_MODELS } from "./models.js";
import { streamAntigravity } from "./stream.js";

function getAgentDir(): string {
	const envDir = process.env.PRIME_AGENT_CODING_AGENT_DIR ?? process.env.PI_CODING_AGENT_DIR;
	if (envDir) {
		if (envDir === "~") return homedir();
		if (envDir.startsWith("~/")) return join(homedir(), envDir.slice(2));
		return envDir;
	}
	return join(homedir(), ".prime", "agent");
}

async function main() {
	const modelId = process.argv[2] || "claude-sonnet-4-6";
	const modelConfig = STATIC_PROVIDER_MODELS.find((m) => m.id === modelId);
	if (!modelConfig) {
		console.error(`Unknown model: ${modelId}`);
		console.error("Available:", STATIC_PROVIDER_MODELS.map((m) => m.id).join(", "));
		process.exit(1);
	}

	type Credential = { type?: string; access?: string; projectId?: string };
	const authPath = join(getAgentDir(), "auth.json");
	const auth = JSON.parse(readFileSync(authPath, "utf-8")) as Record<string, Credential | Credential[]>;
	const stored = auth["google-antigravity"];
	const credential = (Array.isArray(stored) ? stored : [stored]).find(
		(entry) => entry?.type === "oauth" && typeof entry.access === "string" && entry.access.length > 0,
	);
	const access = credential?.access;
	if (!access) {
		console.error("No google-antigravity credentials. Run /login google-antigravity first.");
		process.exit(1);
	}

	const apiKey = JSON.stringify({ token: access, projectId: credential?.projectId ?? "" });

	registerApiProvider({
		api: "google-antigravity" as Api,
		stream: (model, context, options) => streamAntigravity(model, context, options),
		streamSimple: (model, context, options) => streamAntigravity(model, context, options),
	});

	const model: Model<Api> = {
		id: modelConfig.id,
		name: modelConfig.name,
		api: "google-antigravity" as Api,
		provider: "google-antigravity",
		baseUrl: "https://daily-cloudcode-pa.googleapis.com",
		reasoning: modelConfig.reasoning,
		input: modelConfig.input,
		cost: modelConfig.cost,
		contextWindow: modelConfig.contextWindow,
		maxTokens: modelConfig.maxTokens,
	};

	const context: Context = {
		messages: [{ role: "user", content: "Say hello in exactly 3 words.", timestamp: Date.now() }],
	};

	const s = streamSimple(model, context, { apiKey, maxTokens: 100, reasoning: "low" });
	for await (const event of s) {
		if (event.type === "thinking_delta") process.stdout.write(event.delta);
		else if (event.type === "text_delta") process.stdout.write(event.delta);
		else if (event.type === "error") console.error("\nError:", event.error.errorMessage);
		else if (event.type === "done") console.log("\n\nDone!", event.reason, event.message.usage);
	}
}

main().catch((error) => {
	console.error(error);
	process.exit(1);
});
