/**
 * Ler e escrever números do jeito que a pessoa digita num campo.
 *
 * Sem React de propósito: são as regras puras que o campo decimal
 * (components/ui/campo-decimal.tsx) e os formulários com estado em texto usam,
 * e que o teste ao lado confere.
 */

const PADRAO_DECIMAL = /^-?\d*(?:[.,]\d*)?$/;

/** O texto pode ficar no campo? Dígitos e no máximo um separador decimal. */
export function textoDecimalValido(texto: string, permiteNegativo = false): boolean {
  if (!PADRAO_DECIMAL.test(texto)) return false;
  return permiteNegativo || !texto.startsWith("-");
}

/** Só dígitos: para contagens (peças por folha, centavos). */
export function textoInteiroValido(texto: string): boolean {
  return /^\d*$/.test(texto);
}

/**
 * Lê um número do jeito que a pessoa escreveu: "0,160", "0.160", "1.234,56",
 * "R$ 12,50", "10%". Texto vazio ou sem sentido vira 0.
 */
export function numeroDoTexto(texto: string | number | null | undefined): number {
  if (typeof texto === "number") return Number.isFinite(texto) ? texto : 0;
  let t = String(texto ?? "").replace(/[^\d.,-]/g, "");
  const temVirgula = t.includes(",");
  const temPonto = t.includes(".");
  if (temVirgula && temPonto) {
    /* Os dois juntos: o último separador é o decimal, os outros são de milhar. */
    const ultimo = Math.max(t.lastIndexOf(","), t.lastIndexOf("."));
    t = t.slice(0, ultimo).replace(/[.,]/g, "") + "." + t.slice(ultimo + 1);
  } else if (temVirgula || temPonto) {
    /* Um separador só é decimal; repetido ("1.234.567") é de milhar. */
    const partes = t.split(temVirgula ? "," : ".");
    t = partes.length === 2 ? partes.join(".") : partes.join("");
  }
  const n = Number(t);
  return Number.isFinite(n) ? n : 0;
}

/** O número como texto de campo, em português: 0,16 e não 0.16. */
export function textoDoNumero(n: number | null | undefined, zeroVazio = false): string {
  if (n == null || !Number.isFinite(n)) return "";
  if (n === 0 && zeroVazio) return "";
  return n.toLocaleString("pt-BR", { maximumFractionDigits: 6, useGrouping: false });
}
