/**
 * Normalización de teléfonos a E.164, base de la deduplicación de leads (CRM-10).
 *
 * El mismo cliente escribe su número de cinco formas distintas según por dónde
 * entre: "0981 123-456" en el mostrador, "+595981123456" en WhatsApp,
 * "595981123456" en un webhook de Meta. Sin normalizar, cada forma crea un lead.
 *
 * Alcance deliberadamente chico: Paraguay. Un número que ya viene con "+" de
 * otro país se respeta tal cual, no se intenta adivinar nada.
 *
 * Nota: `src/cartera/campanas/campanas.service.ts` tiene una heurística inline
 * equivalente (líneas ~293). Cuando haya que tocar ese servicio, conviene que
 * pase a usar esto; no se migra ahora para no mover código que funciona.
 */

const PREFIJO_PY = '+595';

/** Móviles paraguayos: 9 dígitos que arrancan con 9 (9x xxx xxx). */
const MOVIL_PY = /^9\d{8}$/;
/** Fijos y móviles con 0 inicial: 0981123456, 021555444. */
const CON_CERO_PY = /^0\d{8,9}$/;

/**
 * Devuelve el número en E.164 (`+595981123456`) o `null` si no se puede
 * interpretar. Nunca lanza: un teléfono basura es un dato malo, no un error.
 */
export function aE164(valor: string | null | undefined): string | null {
  if (!valor) return null;

  const crudo = String(valor).trim();
  if (!crudo) return null;

  // Un "+" sólo vale al principio; el resto de la basura (espacios, guiones,
  // paréntesis, puntos) se descarta.
  const tienePlus = crudo.startsWith('+');
  const digitos = crudo.replace(/\D/g, '');
  if (!digitos) return null;

  if (tienePlus) {
    // Ya viene internacional. Se respeta, sea de Paraguay o no.
    return digitos.length >= 8 && digitos.length <= 15 ? `+${digitos}` : null;
  }

  if (digitos.startsWith('595')) {
    const resto = digitos.slice(3);
    return resto.length >= 8 && resto.length <= 10 ? `${PREFIJO_PY}${resto}` : null;
  }

  if (CON_CERO_PY.test(digitos)) return `${PREFIJO_PY}${digitos.slice(1)}`;
  if (MOVIL_PY.test(digitos)) return `${PREFIJO_PY}${digitos}`;

  // No se adivina: mejor dejarlo sin normalizar que inventar un número que
  // después choque en el índice único de leads contra otro cliente real.
  return null;
}

/** true si los dos valores apuntan al mismo teléfono una vez normalizados. */
export function mismoTelefono(a: string | null | undefined, b: string | null | undefined): boolean {
  const na = aE164(a);
  const nb = aE164(b);
  return na !== null && na === nb;
}

/** Para mostrar: `+595981123456` → `0981 123 456`. Si no es de Paraguay, se devuelve igual. */
export function formatoLocalPy(e164: string | null | undefined): string | null {
  if (!e164) return null;
  if (!e164.startsWith(PREFIJO_PY)) return e164;
  const n = e164.slice(PREFIJO_PY.length);
  if (n.length !== 9) return e164;
  return `0${n.slice(0, 3)} ${n.slice(3, 6)} ${n.slice(6)}`;
}
