import { describe, expect, it } from "vitest";
import {
  MoneyFormatError,
  divideRoundHalfUp,
  fromCents,
  percentageOf,
  toCents,
  toPercentHundredths,
} from "@/lib/domain/money";

describe("money", () => {
  it("convierte texto ↔ céntimos sin pérdida", () => {
    expect(toCents("24900")).toBe(2_490_000n);
    expect(toCents("24900.5")).toBe(2_490_050n);
    expect(toCents("0.07")).toBe(7n);
    expect(fromCents(2_490_050n)).toBe("24900.50");
    expect(fromCents(7n)).toBe("0.07");
  });

  it("evita el error clásico de flotantes (0.1 + 0.2)", () => {
    expect(fromCents(toCents("0.1") + toCents("0.2"))).toBe("0.30");
  });

  it("rechaza formatos inválidos", () => {
    for (const bad of ["", "abc", "-1", "1.234", "1,000", "1e3"]) {
      expect(() => toCents(bad)).toThrow(MoneyFormatError);
    }
  });

  it("porcentajes de 0 a 100 con 2 decimales", () => {
    expect(toPercentHundredths("3.5")).toBe(350n);
    expect(toPercentHundredths("100")).toBe(10_000n);
    expect(() => toPercentHundredths("100.01")).toThrow(MoneyFormatError);
  });

  it("redondeo half up", () => {
    expect(divideRoundHalfUp(5n, 10n)).toBe(1n);
    expect(divideRoundHalfUp(4n, 10n)).toBe(0n);
    expect(percentageOf(toCents("24900"), 150n)).toBe(37_350n);
  });
});
