import { describe, it, expect } from "vitest";
import { getalInLetters, bedragInLetters, bedragCijfersExact, parseBedragInvoer, formatteerDatumVoluit, formatteerDatumVoluitFr } from "./format";

describe("getalInLetters", () => {
  it("schrijft kleine getallen", () => {
    expect(getalInLetters(0)).toBe("nul");
    expect(getalInLetters(1)).toBe("een");
    expect(getalInLetters(7)).toBe("zeven");
    expect(getalInLetters(19)).toBe("negentien");
  });

  it("schrijft tientallen met tussen-n en trema", () => {
    expect(getalInLetters(20)).toBe("twintig");
    expect(getalInLetters(21)).toBe("eenentwintig");
    expect(getalInLetters(22)).toBe("tweeëntwintig");
    expect(getalInLetters(23)).toBe("drieëntwintig");
    expect(getalInLetters(45)).toBe("vijfenveertig");
    expect(getalInLetters(99)).toBe("negenennegentig");
  });

  it("schrijft honderdtallen", () => {
    expect(getalInLetters(100)).toBe("honderd");
    expect(getalInLetters(101)).toBe("honderdeen");
    expect(getalInLetters(345)).toBe("driehonderdvijfenveertig");
  });

  it("schrijft duizendtallen", () => {
    expect(getalInLetters(1000)).toBe("duizend");
    expect(getalInLetters(35000)).toBe("vijfendertigduizend");
    expect(getalInLetters(315000)).toBe("driehonderdvijftienduizend");
    expect(getalInLetters(350000)).toBe("driehonderdvijftigduizend");
  });

  it("schrijft miljoenen met 'miljoen' los", () => {
    expect(getalInLetters(1_000_000)).toBe("een miljoen");
    expect(getalInLetters(1_250_000)).toBe("een miljoen tweehonderdvijftigduizend");
    expect(getalInLetters(2_000_000)).toBe("twee miljoen");
  });

  it("geeft leeg terug voor negatieve of te grote getallen", () => {
    expect(getalInLetters(-5)).toBe("");
    expect(getalInLetters(1_000_000_000)).toBe("");
  });

  it("negeert centen (gehele euro's)", () => {
    expect(getalInLetters(350000.99)).toBe("driehonderdvijftigduizend");
  });
});

describe("bedragInLetters", () => {
  it("voegt 'euro' toe", () => {
    expect(bedragInLetters(350000)).toBe("driehonderdvijftigduizend euro");
    expect(bedragInLetters(0)).toBe("nul euro");
  });
});

describe("bedragCijfersExact", () => {
  it("toont gehele bedragen zonder decimalen en niet-gehele mét 2 decimalen (nooit stil afronden)", () => {
    expect(bedragCijfersExact(350000)).toBe("350.000");
    expect(bedragCijfersExact(42555.5)).toBe("42.555,50");
    expect(bedragCijfersExact(0.05)).toBe("0,05");
  });
});

describe("parseBedragInvoer", () => {
  it("neemt een JSON-getal exact over (regressie: 250000.5 werd via parseBedrag 2.500.005)", () => {
    expect(parseBedragInvoer(250000.5)).toBe(250000.5);
    expect(parseBedragInvoer(350000)).toBe(350000);
    expect(parseBedragInvoer(NaN)).toBe(0);
  });

  it("leest een punt met 1–2 decimalen als decimaalteken, en behoudt de Belgische conventie voor de rest", () => {
    expect(parseBedragInvoer("250000.5")).toBe(250000.5);
    expect(parseBedragInvoer("250000.50")).toBe(250000.5);
    expect(parseBedragInvoer("350.000")).toBe(350000); // BE-duizendtal
    expect(parseBedragInvoer("1.250,50")).toBe(1250.5); // BE-decimaal
    expect(parseBedragInvoer("")).toBe(0);
    expect(parseBedragInvoer(undefined)).toBe(0);
  });
});

describe("formatteerDatumVoluit", () => {
  it("zet een ISO-datum om naar de voluit-vorm", () => {
    expect(formatteerDatumVoluit("1970-03-12")).toBe("12 maart 1970");
    expect(formatteerDatumVoluit("2026-01-01")).toBe("1 januari 2026");
    expect(formatteerDatumVoluit("2026-12-31")).toBe("31 december 2026");
  });

  it("laat niet-herkende of reeds geformatteerde invoer ongewijzigd", () => {
    expect(formatteerDatumVoluit("12 maart 1970")).toBe("12 maart 1970");
    expect(formatteerDatumVoluit("")).toBe("");
    expect(formatteerDatumVoluit("2026-13-40")).toBe("2026-13-40");
  });
});

describe("formatteerDatumVoluitFr", () => {
  it("gebruikt Franse maandnamen", () => {
    expect(formatteerDatumVoluitFr("1970-03-12")).toBe("12 mars 1970");
    expect(formatteerDatumVoluitFr("2026-08-01")).toBe("1 août 2026");
  });
  it("laat niet-herkende invoer ongewijzigd", () => {
    expect(formatteerDatumVoluitFr("geen datum")).toBe("geen datum");
  });
});
