import { afterEach, describe, expect, test } from "bun:test";
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { Journal } from "./journal";
import { startServer, type CollectorServer } from "./server";
import { CollectorState } from "./state";

const token = "seats-route-token";
let server: CollectorServer | undefined;
let root: string | undefined;
afterEach(() => { server?.stop(true); server = undefined; if (root) rmSync(root, { recursive: true, force: true }); root = undefined; });

function start(withPanel: boolean): string {
  root = mkdtempSync(join(tmpdir(), "overdeck-seats-route-"));
  const state = new CollectorState(new Journal(join(root, "items.jsonl")));
  state.registerAdapter("seats", 10_000);
  if (withPanel) state.recordSuccess("seats", Date.now(), [], [{ id: "seats", ts: "2026-08-16T00:00:00.000Z", data: { hosts: [], rows: [], observedAt: "2026-08-16T00:00:00.000Z" } }]);
  server = startServer({ host: "127.0.0.1", port: 0, token, state });
  return `http://127.0.0.1:${server.port}`;
}

describe("GET /seats", () => {
  test("requires the collector bearer token and serves the snapshot", async () => {
    const origin = start(true);
    expect((await fetch(`${origin}/seats`)).status).toBe(401);
    const response = await fetch(`${origin}/seats`, { headers: { authorization: `Bearer ${token}` } });
    expect(response.status).toBe(200);
    expect(await response.json()).toMatchObject({ hosts: [], rows: [] });
  });
  test("reports unavailable before the adapter has a snapshot", async () => {
    const origin = start(false);
    expect((await fetch(`${origin}/seats`, { headers: { authorization: `Bearer ${token}` } })).status).toBe(503);
  });
});
