"""Clave de importacion determinista de contactos para imports idempotentes.

Genera una clave estable a partir de los datos de un contacto (telefono, email,
nombre) para que re-importar el mismo .vcf de Google matchee la fila existente
sin depender de UIDs opacos ni de nombres que el pipeline de import transforma.
"""

import hashlib
import re
import unicodedata


def contact_import_key(
    name: str = "",
    phones: list = None,
    emails: list = None,
) -> str:
    """Calcula una clave de importacion determinista para un contacto.

    La identidad se construye priorizando lo mas estable entre exports de
    Google: telefono normalizado > email normalizado > nombre normalizado.
    La funcion es pura: dada la misma entrada devuelve siempre la misma clave,
    sin I/O ni estado mutable.

    Args:
        name: nombre del contacto (FN). Solo se usa como ultimo recurso.
        phones: lista de telefonos en cualquier formato. Cada uno se reduce a
            sus digitos y se queda con los ultimos 9 (numero nacional estable).
        emails: lista de emails. Se pasan a minusculas y se filtran los que no
            contienen "@".

    Returns:
        Clave determinista con el formato "v1-" + 16 hex chars del SHA-1 de la
        identity string. Longitud total fija de 19 caracteres.
    """
    phones = phones or []
    emails = emails or []

    # 1. Normalizar phones: solo digitos, ultimos 9 si len>=9, dedup + sort.
    phones_norm = set()
    for p in phones:
        digits = re.sub(r"\D", "", str(p))
        if not digits:
            continue
        if len(digits) >= 9:
            digits = digits[-9:]
        phones_norm.add(digits)
    phones_sorted = sorted(phones_norm)

    # 2. Normalizar emails: lowercase + strip, descartar vacios y sin "@".
    emails_norm = set()
    for e in emails:
        e = str(e).strip().lower()
        if not e or "@" not in e:
            continue
        emails_norm.add(e)
    emails_sorted = sorted(emails_norm)

    # 3. Normalizar name: NFKD sin acentos, lowercase, colapsar espacios,
    #    quedarse solo con [a-z0-9 ].
    decomposed = unicodedata.normalize("NFKD", name or "")
    without_marks = "".join(c for c in decomposed if not unicodedata.combining(c))
    lowered = without_marks.lower()
    collapsed = re.sub(r"\s+", " ", lowered).strip()
    name_norm = re.sub(r"[^a-z0-9 ]", "", collapsed)

    # 4. Identity string priorizando lo mas estable.
    if phones_sorted:
        identity = "tel:" + ",".join(phones_sorted)
    elif emails_sorted:
        identity = "email:" + ",".join(emails_sorted)
    else:
        identity = "name:" + name_norm

    # 5. Clave versionada.
    digest = hashlib.sha1(identity.encode("utf-8")).hexdigest()[:16]
    return "v1-" + digest
