import { test } from "node:test";
import assert from "node:assert/strict";
import { custoDoProduto, fichaPorUnidadeDeVenda } from "./custo-do-produto.ts";

test("o caso do print: banner do assistente nao soma o custo duas vezes", () => {
  /* Ficha de 32,91 por peça de referência de 1,00 x 0,70 (0,7 m²), estimado 0
     porque a ficha já é o custo inteiro: o custo por m² sai 47,01 — e não os
     79,92 da soma cega que apareceram na tela. */
  const custo = custoDoProduto({
    estimatedBaseCost: 0,
    somaDaFicha: 32.91,
    unitType: "square_meter",
    referenceWidthM: 1.0,
    referenceHeightM: 0.7,
  });
  assert.equal(custo, 47.01);
});

test("produto antigo continua aditivo, sem mudanca nenhuma", () => {
  /* Nos 84 produtos com ficha de antes, o estimado era custo avulso (fora da
     ficha) e a soma era intencional. Unit sem referência: mesma conta de
     sempre. */
  assert.equal(custoDoProduto({ estimatedBaseCost: 10, somaDaFicha: 25, unitType: "unit" }), 35);
  assert.equal(
    custoDoProduto({ estimatedBaseCost: 10, somaDaFicha: 25, unitType: "square_meter" }),
    35
  );
});

test("medido com referencia divide a ficha pela area", () => {
  assert.equal(
    fichaPorUnidadeDeVenda({ somaDaFicha: 32.91, unitType: "square_meter", referenceWidthM: 1, referenceHeightM: 0.7 }),
    47.01
  );
  /* Unit ignora a referência mesmo se gravada. */
  assert.equal(
    fichaPorUnidadeDeVenda({ somaDaFicha: 32.91, unitType: "unit", referenceWidthM: 1, referenceHeightM: 0.7 }),
    32.91
  );
});

test("valores sujos nao viram custo", () => {
  assert.equal(custoDoProduto({ estimatedBaseCost: null, somaDaFicha: NaN, unitType: null }), 0);
  assert.equal(custoDoProduto({ estimatedBaseCost: -5, somaDaFicha: 10, unitType: "unit" }), 10);
});
