import { test } from "node:test";
import assert from "node:assert/strict";
import { createRequire } from "node:module";

import { normalizeAntigravityClientProfile } from "../../src/shared/constants/antigravityClientProfile.ts";
import {
  applyAntigravityClientProfileHeaders,
  getAntigravityBootstrapHeaders,
  antigravityHarnessUserAgent,
  getAntigravityClientProfile,
} from "../../open-sse/services/antigravityClientProfile.ts";
import { antigravityUserAgent } from "../../open-sse/services/antigravityHeaders.ts";
import { deriveAntigravityMachineId } from "../../open-sse/services/antigravityIdentity.ts";
import {
  seedAntigravityVersionCache,
  clearAntigravityVersionCache,
} from "../../open-sse/services/antigravityVersion.ts";

const require = createRequire(import.meta.url);
const { machineIdSync } = require("node-machine-id") as {
  machineIdSync: (original?: boolean) => string;
};

test.afterEach(() => {
  clearAntigravityVersionCache();
});

test("normalizeAntigravityClientProfile maps cli/sdk aliases to harness", () => {
  assert.equal(normalizeAntigravityClientProfile("cli"), "harness");
  assert.equal(normalizeAntigravityClientProfile("SDK"), "harness");
  assert.equal(normalizeAntigravityClientProfile("ide"), "ide");
  assert.equal(normalizeAntigravityClientProfile(undefined), "ide");
});

test("getAntigravityClientProfile reads providerSpecificData.clientProfile per connection", () => {
  assert.equal(
    getAntigravityClientProfile({
      providerSpecificData: { clientProfile: "harness" },
    }),
    "harness"
  );
  assert.equal(getAntigravityClientProfile({ providerSpecificData: {} }), "ide");
});

test("applyAntigravityClientProfileHeaders uses IDE fingerprint by default", () => {
  seedAntigravityVersionCache("4.2.0");
  const headers: Record<string, string> = {
    Authorization: "Bearer token",
    "Content-Type": "application/json",
  };

  applyAntigravityClientProfileHeaders(
    headers,
    { connectionId: "conn-1", providerSpecificData: {} },
    { project: "project-1" }
  );

  assert.match(headers["User-Agent"], /^Antigravity\/4\.2\.0 /);
  assert.equal(headers["x-client-name"], "antigravity");
  assert.equal(headers["x-client-version"], "4.2.0");
  assert.equal(typeof headers["x-machine-id"], "string");
  assert.equal(typeof headers["x-vscode-sessionid"], "string");
  assert.equal(headers["x-goog-user-project"], "project-1");
  assert.equal(headers["X-Goog-Api-Client"], undefined);
});

test("antigravityUserAgent matches Antigravity Manager platform fingerprints", () => {
  assert.equal(
    antigravityUserAgent("4.2.0", "darwin"),
    "Antigravity/4.2.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/132.0.6834.160 Electron/39.2.3"
  );
  assert.equal(
    antigravityUserAgent("4.2.0", "win32"),
    "Antigravity/4.2.0 (Windows NT 10.0; Win64; x64) Chrome/132.0.6834.160 Electron/39.2.3"
  );
  assert.equal(
    antigravityUserAgent("4.2.0", "linux"),
    "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/132.0.6834.160 Electron/39.2.3"
  );
});

test("deriveAntigravityMachineId uses the raw system machine id like Antigravity Manager", () => {
  let systemMachineId: string | null = null;
  try {
    systemMachineId = machineIdSync(true);
  } catch {
    systemMachineId = null;
  }
  if (!systemMachineId) return;

  assert.equal(deriveAntigravityMachineId(), systemMachineId);
});

test("antigravityHarnessUserAgent uses Go harness platform and arch names", () => {
  assert.equal(
    antigravityHarnessUserAgent("2.0.1", "darwin", "arm64"),
    "antigravity/2.0.1 darwin/arm64"
  );
  assert.equal(
    antigravityHarnessUserAgent("2.0.1", "win32", "x64"),
    "antigravity/2.0.1 windows/amd64"
  );
  assert.equal(
    antigravityHarnessUserAgent("2.0.1", "linux", "x64"),
    "antigravity/2.0.1 linux/amd64"
  );
});

test("getAntigravityBootstrapHeaders uses SDK loadCodeAssist harness fingerprint", () => {
  seedAntigravityVersionCache("2.0.1");

  const headers = getAntigravityBootstrapHeaders("harness", "token");

  assert.equal(headers.Authorization, "Bearer token");
  assert.equal(
    headers["User-Agent"],
    `${antigravityHarnessUserAgent("2.0.1")} google-api-nodejs-client/10.3.0`
  );
  assert.equal(headers["X-Goog-Api-Client"], "gl-node/22.21.1");
  assert.equal(headers["Client-Metadata"], undefined);
});

test("applyAntigravityClientProfileHeaders uses harness fingerprint when configured", () => {
  seedAntigravityVersionCache("4.2.0");
  const headers: Record<string, string> = {
    Authorization: "Bearer token",
    "Content-Type": "application/json",
    "x-client-name": "antigravity",
    "x-vscode-sessionid": "old-session",
  };

  applyAntigravityClientProfileHeaders(
    headers,
    { connectionId: "conn-2", providerSpecificData: { clientProfile: "harness" } },
    { project: "project-2" }
  );

  assert.equal(headers["User-Agent"], antigravityHarnessUserAgent("4.2.0"));
  assert.equal(headers["X-Goog-Api-Client"], undefined);
  assert.equal(headers["x-client-name"], undefined);
  assert.equal(headers["x-vscode-sessionid"], undefined);
  assert.equal(headers["x-goog-user-project"], "project-2");
});
