import { describe, expect, it } from "vitest";

import { parseClaudeJson, parseClaudeJsonText } from "./claude.js";

describe("claude JSON parsing", () => {
  it("extracts text from single JSON object", () => {
    const out = parseClaudeJsonText('{"text":"hello"}');
    expect(out).toBe("hello");
  });

  it("extracts from newline-delimited JSON", () => {
    const out = parseClaudeJsonText('{"irrelevant":1}\n{"text":"there"}');
    expect(out).toBe("there");
  });

  it("returns undefined on invalid JSON", () => {
    expect(parseClaudeJsonText("not json")).toBeUndefined();
  });

  it("extracts text from Claude CLI result field and preserves metadata", () => {
    const sample = {
      type: "result",
      subtype: "success",
      result: "hello from result field",
      duration_ms: 1234,
      usage: { server_tool_use: { tool_a: 2 } },
    };
    const parsed = parseClaudeJson(JSON.stringify(sample));
    expect(parsed?.text).toBe("hello from result field");
    expect(parsed?.parsed).toMatchObject({ duration_ms: 1234 });
    expect(parsed?.valid).toBe(true);
  });

  it("marks invalid Claude JSON as invalid but still attempts text extraction", () => {
    const parsed = parseClaudeJson('{"unexpected":1}');
    expect(parsed?.valid).toBe(false);
    expect(parsed?.text).toBeUndefined();
  });
});
