import { describe, it, expect } from "vitest";
import { formatMerkmal, toEckdaten, type MerkmalRow } from "./merkmale";

function row(p: Partial<MerkmalRow>): MerkmalRow {
  return {
    merkmalId: "00000000-0000-0000-0000-000000000000",
    name: "Merkmal",
    typ: "text",
    einheit: null,
    reihenfolge: 0,
    valueNum: null,
    valueText: null,
    valueBool: null,
    enumLabel: null,
    ...p,
  };
}

describe("formatMerkmal", () => {
  it("number mit Einheit -> Tausenderpunkt + NBSP (de-AT)", () => {
    const out = formatMerkmal(
      row({ typ: "number", einheit: "l", valueNum: 14000 }),
    );
    expect(out).toBe("14.000 l");
  });

  it("number ohne Einheit -> nur Zahl", () => {
    expect(formatMerkmal(row({ typ: "number", valueNum: 1500 }))).toBe("1.500");
  });

  it("boolean false -> Nein", () => {
    expect(formatMerkmal(row({ typ: "boolean", valueBool: false }))).toBe("Nein");
  });

  it("boolean true -> Ja", () => {
    expect(formatMerkmal(row({ typ: "boolean", valueBool: true }))).toBe("Ja");
  });

  it("enum mit enumLabel -> Label", () => {
    expect(
      formatMerkmal(
        row({ typ: "enum", valueText: "fpn_10_2000", enumLabel: "FPN 10-2000" }),
      ),
    ).toBe("FPN 10-2000");
  });

  it("enum ohne Label -> roher Wert", () => {
    expect(formatMerkmal(row({ typ: "enum", valueText: "sonst" }))).toBe("sonst");
  });

  it("text -> roher Wert", () => {
    expect(formatMerkmal(row({ typ: "text", valueText: "Hallo" }))).toBe("Hallo");
  });

  it("alle null -> Leerwert (–)", () => {
    expect(formatMerkmal(row({ typ: "number" }))).toBe("–");
    expect(formatMerkmal(row({ typ: "boolean" }))).toBe("–");
    expect(formatMerkmal(row({ typ: "enum" }))).toBe("–");
    expect(formatMerkmal(row({ typ: "text" }))).toBe("–");
  });

  it("text mit nur Whitespace -> Leerwert", () => {
    expect(formatMerkmal(row({ typ: "text", valueText: "   " }))).toBe("–");
  });
});

describe("toEckdaten", () => {
  it("sortiert nach reihenfolge und baut Label mit Einheit", () => {
    const rows: MerkmalRow[] = [
      row({ name: "B", typ: "number", einheit: "l", valueNum: 2000, reihenfolge: 2 }),
      row({ name: "A", typ: "boolean", valueBool: true, reihenfolge: 1 }),
    ];
    const out = toEckdaten(rows);
    expect(out.map((e) => e.label)).toEqual(["A", "B (l)"]);
    expect(out.map((e) => e.wert)).toEqual(["Ja", "2.000 l"]);
  });

  it("leeres Array -> leeres Ergebnis", () => {
    expect(toEckdaten([])).toEqual([]);
  });
});
