// ── Tekst-extractie uit een aangeleverd .docx — bewaakt ──────────────────────
// Het conventie-nazicht leest het Word-bestand van de wederpartij als platte
// tekst: alinea's blijven regels, entiteiten worden gedecodeerd en reeds
// aanwezige revisies worden gelezen alsof ze aanvaard zijn.

import { describe, expect, it } from "vitest";
import { DeletedTextRun, Document, Packer, Paragraph, TextRun } from "docx";
import { extraheerTekstUitDocx } from "./leesDocxTekst";

async function maakDocx(paragrafen: Paragraph[]): Promise<ArrayBuffer> {
  const buffer = await Packer.toBuffer(new Document({ sections: [{ children: paragrafen }] }));
  return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) as ArrayBuffer;
}

describe("extraheerTekstUitDocx", () => {
  it("zet elke alinea om in een regel en decodeert XML-entiteiten", async () => {
    const bestand = await maakDocx([
      new Paragraph({ children: [new TextRun("Verkoper & koper komen overeen:")] }),
      new Paragraph({ children: [new TextRun("de prijs bedraagt < 500.000 euro.")] }),
    ]);
    const tekst = await extraheerTekstUitDocx(bestand);
    expect(tekst.split("\n")).toEqual([
      "Verkoper & koper komen overeen:",
      "de prijs bedraagt < 500.000 euro.",
    ]);
  });

  it("leest bestaande revisies alsof ze aanvaard zijn (w:delText overslaan)", async () => {
    const bestand = await maakDocx([
      new Paragraph({
        children: [
          new TextRun("Behouden tekst. "),
          new DeletedTextRun({ text: "Geschrapte tekst.", id: 1, author: "Confrater", date: "2026-07-01T00:00:00Z" }),
        ],
      }),
    ]);
    const tekst = await extraheerTekstUitDocx(bestand);
    expect(tekst).toContain("Behouden tekst.");
    expect(tekst).not.toContain("Geschrapte tekst.");
  });

  it("weigert een bestand dat geen .docx is met een duidelijke fout", async () => {
    const geenZip = new TextEncoder().encode("dit is geen zip").buffer as ArrayBuffer;
    await expect(extraheerTekstUitDocx(geenZip)).rejects.toThrow(/\.docx/);
  });
});
