import { test } from "node:test";
import assert from "node:assert/strict";
import { SseParser, validName, nameFromFolder, suggestAgentName, expandHome, shimArgs, mergeMcpConfig, projectForFolder, esc } from "../out/pure.mjs";

test("server-sent events are split into their data, across chunks", () => {
  const p = new SseParser();
  assert.deepEqual(p.push(": subscribed\n\nda"), []);
  assert.deepEqual(p.push('ta: {"kind":"message.posted"}\n\ndata: a\r\ndata: b\n\n'), ['{"kind":"message.posted"}', "a\nb"]);
});

test("names are Spectra's", () => {
  assert.ok(validName("claude-oxygen"));
  assert.ok(!validName("Claude"));
  assert.ok(!validName("-x"));
  assert.equal(nameFromFolder("/home/a/My Book/"), "my-book");
  assert.equal(suggestAgentName("claude-code", "book", []), "claude-book");
  assert.equal(suggestAgentName("antigravity", "book", ["agy-book"]), "agy-book-2");
});

test("homes and shim arguments", () => {
  assert.equal(expandHome("~/.spectra-agents/x", "/home/a"), "/home/a/.spectra-agents/x");
  assert.equal(expandHome("/abs", "/home/a"), "/abs");
  assert.deepEqual(shimArgs("claude-book", "/h"), ["mcp", "--agent", "claude-book", "--home", "/h"]);
});

test("Antigravity's config keeps its other servers", () => {
  const before = JSON.stringify({ mcpServers: { other: { command: "x" } }, theme: "dark" });
  const after = JSON.parse(mergeMcpConfig(before, "/bin/spectra", ["mcp", "--agent", "agy-book"]));
  assert.deepEqual(after.mcpServers.other, { command: "x" });
  assert.deepEqual(after.mcpServers.spectra, { command: "/bin/spectra", args: ["mcp", "--agent", "agy-book"] });
  assert.equal(after.theme, "dark");
  assert.deepEqual(JSON.parse(mergeMcpConfig("", "s", [])).mcpServers.spectra, { command: "s", args: [] });
});

test("a folder belongs to the deepest project that holds it", () => {
  const ps = [{ name: "dev", path: "/home/a/dev" }, { name: "book", path: "/home/a/dev/book" }, { name: "idea", path: null }];
  assert.equal(projectForFolder(ps, "/home/a/dev/book"), "book");
  assert.equal(projectForFolder(ps, "/home/a/dev/book/ch3"), "book");
  assert.equal(projectForFolder(ps, "/home/a/dev/other"), "dev");
  assert.equal(projectForFolder(ps, "/home/a/devx"), undefined);
});

test("HTML is escaped", () => {
  assert.equal(esc(`<b a="1">'&`), "&lt;b a=&quot;1&quot;&gt;&#39;&amp;");
});
