/* Os números da XBZ do jeito que a gráfica lê. */

const inteiro = new Intl.NumberFormat("pt-BR", { maximumFractionDigits: 0 });
const decimal = new Intl.NumberFormat("pt-BR", { maximumFractionDigits: 1 });
const dinheiro = new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" });

export const emReais = (valor: number | null | undefined) => (typeof valor === "number" && Number.isFinite(valor) ? dinheiro.format(valor) : "—");

export const quantidade = (valor: number | null | undefined) => (typeof valor === "number" && Number.isFinite(valor) ? inteiro.format(valor) : "—");

export function faixaDePreco(minimo: number | null, maximo: number | null) {
  if (minimo === null) return "Sem preço";
  if (maximo === null || Math.abs(maximo - minimo) < 0.005) return emReais(minimo);
  return `${emReais(minimo)} a ${emReais(maximo)}`;
}

export function peso(gramas: number | null) {
  if (gramas === null) return null;
  return gramas >= 1000 ? `${decimal.format(gramas / 1000)} kg` : `${inteiro.format(gramas)} g`;
}

export function medidas(altura: number | null, largura: number | null, profundidade: number | null) {
  const partes = [altura, largura, profundidade].filter((valor): valor is number => valor !== null && valor > 0);
  if (!partes.length) return null;
  return `${partes.map((valor) => decimal.format(valor)).join(" × ")} cm`;
}

/** "73239300" → "7323.93.00", o jeito que a nota fiscal mostra. */
export function ncmLegivel(ncm: string | null) {
  if (!ncm || ncm.length !== 8) return ncm;
  return `${ncm.slice(0, 4)}.${ncm.slice(4, 6)}.${ncm.slice(6)}`;
}

/** "2026-11-16" → "16/11/2026" (a data da XBZ não tem fuso: é dia, não instante). */
export function dia(data: string | null) {
  if (!data) return null;
  const [ano, mes, diaDoMes] = data.slice(0, 10).split("-");
  return ano && mes && diaDoMes ? `${diaDoMes}/${mes}/${ano}` : data;
}

export function quando(valor: string | null | undefined) {
  if (!valor) return "—";
  const data = new Date(valor);
  if (Number.isNaN(data.getTime())) return valor;
  return new Intl.DateTimeFormat("pt-BR", { dateStyle: "short", timeStyle: "short" }).format(data);
}

export function horaDe(valor: string | null | undefined) {
  if (!valor) return "";
  const data = new Date(valor);
  if (Number.isNaN(data.getTime())) return "";
  const hoje = new Date();
  const mesmoDia = data.toDateString() === hoje.toDateString();
  return mesmoDia
    ? `hoje às ${new Intl.DateTimeFormat("pt-BR", { hour: "2-digit", minute: "2-digit" }).format(data)}`
    : new Intl.DateTimeFormat("pt-BR", { dateStyle: "short", timeStyle: "short" }).format(data);
}

/* A bolinha da cor: o nome em português vira um tom aproximado. */
const TONS: Array<[RegExp, string]> = [
  [/transparente|cristal/i, "#eef2f7"],
  [/azul-marinho|marinho/i, "#1e3a8a"],
  [/azul escuro/i, "#1d4ed8"],
  [/azul claro|turquesa/i, "#38bdf8"],
  [/azul/i, "#2563eb"],
  [/verde escuro/i, "#166534"],
  [/verde claro|verde-água|limão/i, "#4ade80"],
  [/verde/i, "#16a34a"],
  [/vinho/i, "#7f1d1d"],
  [/vermelho/i, "#dc2626"],
  [/rosa escuro|pink/i, "#db2777"],
  [/rosa|salmão/i, "#f472b6"],
  [/lilás|roxo claro/i, "#c084fc"],
  [/roxo/i, "#7c3aed"],
  [/laranja/i, "#f97316"],
  [/amarelo/i, "#facc15"],
  [/dourado|champanhe/i, "#d4a72c"],
  [/cobre|bronze/i, "#b45309"],
  [/café|marrom/i, "#78350f"],
  [/madeira|bambu|kraft|bege|creme|cru/i, "#d6b98c"],
  [/prata|inox|cromado/i, "#b8bec8"],
  [/grafite|chumbo|cinza escuro/i, "#4b5563"],
  [/cinza|fumê/i, "#9ca3af"],
  [/branco/i, "#ffffff"],
  [/preto/i, "#111827"],
];

const tom = (nome: string) => TONS.find(([padrao]) => padrao.test(nome))?.[1] ?? null;

/** A cor da bolinha. Duas cores ("Prata e azul", a caneta de corpo prata e
 * detalhe azul) viram a bolinha dividida ao meio: com uma só, as oito canetas
 * do mesmo modelo apareciam todas cinza. */
export function tomDaCor(rotulo: string) {
  if (/colorido|misto/i.test(rotulo)) return "conic-gradient(#ef4444,#f59e0b,#22c55e,#3b82f6,#a855f7,#ef4444)";
  const [primeira, segunda] = rotulo
    .replace(/\s*\(.*\)$/, "")
    .split(/ e |,/)
    .map((parte) => parte.trim())
    .filter(Boolean);
  const um = tom(primeira ?? rotulo) ?? "#d4d4d8";
  const dois = segunda ? tom(segunda) : null;
  return dois && dois !== um ? `linear-gradient(135deg, ${um} 0 50%, ${dois} 50% 100%)` : um;
}
