/**
 * Cómo se lee un nombre del catálogo de mbinv.
 *
 * Los catálogos de verdad están llenos de marcas que alguien metió en la descripción
 * porque no había otro lugar donde ponerlas: `**MATERIA PRIMA** HARINA DURA POR GRAMO`,
 * `*materia prima* costo de horneado por pieza`. Eso es una etiqueta, no parte del
 * nombre, y repetida cuarenta veces en una pantalla la vuelve ilegible.
 *
 * Acá se separa: la marca se muestra como etiqueta chiquita y el nombre queda limpio.
 *
 * ⚠️ Es SÓLO presentación. El dato no se toca: lo que se guarda, se busca y se manda a
 * mbinv sigue siendo la descripción tal como está en `maeplu`. El día que alguien
 * corrija el catálogo, esto deja de hacer nada y ninguna orden cambia.
 */

/** `**ALGO**` o `*algo*` al principio de la descripción. */
const MARCA_AL_INICIO = /^\s*\*+\s*([^*]+?)\s*\*+\s*/;

export type NombreDeProducto = {
  /** El nombre sin la marca, tal como lo escribió el cliente. */
  nombre: string;
  /** La marca que traía, en minúsculas, o `null` si no traía. */
  etiqueta: string | null;
};

export function leerNombre(descripcion: string | null | undefined): NombreDeProducto {
  const crudo = (descripcion ?? "").trim();

  if (!crudo) {
    return { nombre: "Sin descripción", etiqueta: null };
  }

  const marca = crudo.match(MARCA_AL_INICIO);

  if (!marca) {
    return { nombre: presentable(crudo), etiqueta: null };
  }

  const resto = crudo.slice(marca[0].length).trim();

  // Si al quitar la marca no queda nada, la marca ERA el nombre. Mejor un nombre raro
  // que una fila vacía.
  if (!resto) {
    return { nombre: presentable(marca[1]), etiqueta: null };
  }

  return { nombre: presentable(resto), etiqueta: marca[1].toLowerCase() };
}

/**
 * Sólo se normalizan los espacios. La CAJA NO SE TOCA, y eso fue una decisión.
 *
 * El primer intento pasaba las mayúsculas a mayúscula de oración, porque los catálogos
 * vienen gritando. Se probó con datos reales y `MM BATARD 1200G` quedó `Mm batard 1200g`:
 * peor que el original, y con las unidades rotas —`25KG` → `25kg`, `1200G` → `1200g`—.
 * Estos nombres llevan códigos, marcas y medidas adentro; adivinar cómo se escriben es
 * inventar. Lo que sí es basura declarada —la marca entre asteriscos— se saca; el resto
 * es como el cliente lo escribió.
 */
function presentable(texto: string): string {
  return texto.replace(/\s+/g, " ").trim();
}

/**
 * Cantidades. Los gramos de una fórmula salen con decimales que nadie pesa —63000.0000—
 * y los enteros con `,00` detrás son ruido.
 */
export function cantidad(valor: number | string | null | undefined): string {
  const numero = typeof valor === "string" ? Number(valor) : (valor ?? 0);

  if (!Number.isFinite(numero)) return "—";

  return numero.toLocaleString("es-GT", {
    minimumFractionDigits: 0,
    maximumFractionDigits: Number.isInteger(numero) ? 0 : 2,
  });
}
