/**
 * Quantas peças, de que tamanho, e quanto dá no total — do jeito que se lê.
 *
 * Um item vendido por m² tem DUAS quantidades: as peças (2 banners) e a área
 * (1,4 m²). Colar a unidade de venda na quantidade de peças ("2 m²") mentia
 * para todo mundo: a ficha, a página do pedido, o PDF. Esta função vive num
 * lugar só para as três telas dizerem a mesma coisa: "2 peças · 1 m × 0,7 m
 * · 1,4 m² no total".
 */

export type ItemMedido = {
  quantity?: number | string | null;
  unit_type?: string | null;
  width_m?: number | string | null;
  height_m?: number | string | null;
  length_m?: number | string | null;
};

export type QuantidadeDoItem = {
  /* Peças, como número. */
  pecas: number;
  /* "2 peças", "1 peça", "3 un". */
  pecasTexto: string;
  /* "1 m × 0,7 m" no m², "2 m cada" no metro linear; nulo sem medida. */
  medida: string | null;
  /*
   * A área de UMA peça — "0,7 m²" — e só no metro quadrado.
   *
   * Existe porque ali a medida são as dimensões ("1 m × 0,7 m") e a área de uma
   * peça não está escrita em lugar nenhum: quem confere a entrega com a peça na
   * mão não faz 1 × 0,7 de cabeça. Nas outras unidades fica nulo de propósito,
   * porque lá a medida JÁ é por peça ("0,4 m cada") e repetir seria ruído.
   */
  areaPorPeca: string | null;
  /* "1,4 m² no total", "4 m no total"; nulo no item por unidade. */
  total: string | null;
  totalNumero: number | null;
  /* A unidade em que o preço é dado: un, m2 ou m. */
  unidadeDeVenda: "un" | "m2" | "m";
};

/* Aceita o que o campo de texto manda ("1,00") e o que o banco manda (1). */
const numero = (v: unknown) => {
  const n = typeof v === "string" ? Number(v.trim().replace(",", ".")) : Number(v);
  return Number.isFinite(n) && n > 0 ? n : 0;
};

const ptBr = (n: number) =>
  new Intl.NumberFormat("pt-BR", { minimumFractionDigits: 0, maximumFractionDigits: 3 }).format(n);

/* O resumo curto para rótulos: "2 peças · 1,4 m²", "2 peças · 4 m", "3 un". */
export function resumoDaMedida(item: ItemMedido): string {
  const q = quantidadeDoItem(item);
  if (q.totalNumero === null) return q.pecasTexto;
  return `${q.pecasTexto} · ${ptBr(q.totalNumero)} ${q.unidadeDeVenda === "m2" ? "m²" : "m"}`;
}

export function quantidadeDoItem(item: ItemMedido): QuantidadeDoItem {
  const pecas = numero(item.quantity);
  const pecasTexto = `${ptBr(pecas)} ${pecas === 1 ? "peça" : "peças"}`;

  if (item.unit_type === "square_meter") {
    const largura = numero(item.width_m);
    const altura = numero(item.height_m);
    const daPeca = Math.round(largura * altura * 10000) / 10000;
    const area = Math.round(pecas * largura * altura * 10000) / 10000;
    return {
      pecas,
      pecasTexto,
      medida: largura > 0 && altura > 0 ? `${ptBr(largura)} m × ${ptBr(altura)} m` : null,
      areaPorPeca: daPeca > 0 ? `${ptBr(daPeca)} m²` : null,
      total: area > 0 ? `${ptBr(area)} m² no total` : null,
      totalNumero: area > 0 ? area : null,
      unidadeDeVenda: "m2",
    };
  }

  if (item.unit_type === "linear_meter" || item.unit_type === "meter") {
    const comprimento = numero(item.length_m);
    const metros = Math.round(pecas * comprimento * 10000) / 10000;
    return {
      pecas,
      pecasTexto,
      medida: comprimento > 0 ? `${ptBr(comprimento)} m cada` : null,
      areaPorPeca: null,
      total: metros > 0 ? `${ptBr(metros)} m no total` : null,
      totalNumero: metros > 0 ? metros : null,
      unidadeDeVenda: "m",
    };
  }

  return {
    pecas,
    pecasTexto: `${ptBr(pecas)} un`,
    medida: null,
    areaPorPeca: null,
    total: null,
    totalNumero: null,
    unidadeDeVenda: "un",
  };
}
