import { describe, it, expect } from "vitest";
import { woordDiff } from "./woorddiff";

function herbouw(segmenten: ReturnType<typeof woordDiff>, kant: "oud" | "nieuw"): string {
  return segmenten
    .filter((s) => (kant === "oud" ? s.soort !== "toegevoegd" : s.soort !== "verwijderd"))
    .map((s) => s.tekst)
    .join("");
}

describe("woordDiff", () => {
  it("markeert identieke tekst volledig als gelijk", () => {
    const segmenten = woordDiff("Dit is een tekst.", "Dit is een tekst.");
    expect(segmenten).toEqual([{ soort: "gelijk", tekst: "Dit is een tekst." }]);
  });

  it("markeert een gewijzigd woord als verwijderd + toegevoegd", () => {
    const segmenten = woordDiff("De prijs is 100 euro.", "De prijs is 200 euro.");
    expect(segmenten.some((s) => s.soort === "verwijderd" && s.tekst.includes("100"))).toBe(true);
    expect(segmenten.some((s) => s.soort === "toegevoegd" && s.tekst.includes("200"))).toBe(true);
  });

  it("reconstrueert de oude en nieuwe tekst exact uit de segmenten", () => {
    const oud = "De koper koopt het goed voor 250.000 euro.";
    const nieuw = "De koper verwerft het onroerend goed voor 300.000 euro.";
    const segmenten = woordDiff(oud, nieuw);
    expect(herbouw(segmenten, "oud")).toBe(oud);
    expect(herbouw(segmenten, "nieuw")).toBe(nieuw);
  });

  it("verwerkt volledig nieuwe tekst (geen oude tekst) als louter toegevoegd", () => {
    const segmenten = woordDiff("", "Volledig nieuwe tekst.");
    expect(segmenten.every((s) => s.soort === "toegevoegd")).toBe(true);
  });
});
