import { test } from "node:test";
import assert from "node:assert/strict";
import { quantidadeDoItem } from "./quantidade-do-item.ts";

test("m²: peças, medida e área separadas — nunca '2 m²'", () => {
  const q = quantidadeDoItem({ quantity: 2, unit_type: "square_meter", width_m: 1, height_m: 0.7 });
  assert.equal(q.pecas, 2);
  assert.equal(q.pecasTexto, "2 peças");
  assert.equal(q.medida, "1 m × 0,7 m");
  assert.equal(q.total, "1,4 m² no total");
  assert.equal(q.totalNumero, 1.4);
  assert.equal(q.unidadeDeVenda, "m2");
});

test("metro linear e unidade", () => {
  const m = quantidadeDoItem({ quantity: "2", unit_type: "linear_meter", length_m: 2 });
  assert.equal(m.medida, "2 m cada");
  assert.equal(m.total, "4 m no total");
  /* No metro a medida JA e por peca, entao nao existe area por peca para
     repetir embaixo dela. */
  assert.equal(m.areaPorPeca, null);

  const un = quantidadeDoItem({ quantity: 1, unit_type: "unit" });
  assert.deepEqual(un, {
    pecas: 1,
    pecasTexto: "1 un",
    medida: null,
    areaPorPeca: null,
    total: null,
    totalNumero: null,
    unidadeDeVenda: "un",
  });
});

test("m²: a area de UMA peca, que e o que se confere com a peca na mao", () => {
  /* As dimensoes dizem 1 × 0,7; ninguem multiplica isso de cabeca na porta do
     cliente. O protocolo de entrega imprime os dois: 0,7 m² cada, 1,4 no total. */
  const q = quantidadeDoItem({ quantity: 2, unit_type: "square_meter", width_m: 1, height_m: 0.7 });
  assert.equal(q.areaPorPeca, "0,7 m²");
  assert.equal(q.total, "1,4 m² no total");

  /* Uma peca so: a area por peca e o total dizem o mesmo numero, e esta certo. */
  const uma = quantidadeDoItem({ quantity: 1, unit_type: "square_meter", width_m: 3, height_m: 2 });
  assert.equal(uma.areaPorPeca, "6 m²");
  assert.equal(uma.total, "6 m² no total");

  /* Sem dimensao nao ha area nenhuma para inventar. */
  assert.equal(quantidadeDoItem({ quantity: 3, unit_type: "square_meter" }).areaPorPeca, null);
});

test("m² sem medida: peças ficam, medida e total somem", () => {
  const q = quantidadeDoItem({ quantity: 3, unit_type: "square_meter" });
  assert.equal(q.pecasTexto, "3 peças");
  assert.equal(q.medida, null);
  assert.equal(q.total, null);
});
