"""Extrae el UID de un componente iCal/vCard, o genera uno determinista.

Funcion pura: sin I/O, sin estado, determinista. Busca la propiedad `UID:` en
el texto del componente (VCARD o VEVENT/VCALENDAR). Si no existe, sintetiza un
UID estable derivado del contenido: `<prefix><md5(text)[:16]>`. El mismo texto
de entrada produce siempre el mismo UID sintetico. Solo usa stdlib (re, hashlib).
"""

import hashlib
import re

_UID_RE = re.compile(r"(?:^|\n)UID:(.+)")


def extract_or_make_uid(component_text: str, prefix: str = "goog-") -> str:
    """Devuelve el UID del componente, o uno determinista si no lo tiene.

    Args:
        component_text: texto de un componente VCARD o VEVENT/VCALENDAR.
        prefix: prefijo del UID sintetico cuando el componente no declara UID.
            Default 'goog-' (origen Google export).

    Returns:
        El valor del campo UID stripeado si existe. Si no, un UID determinista
        '<prefix><md5(component_text)[:16]>'. Nunca lanza ni devuelve vacio para
        un input no vacio.
    """
    m = _UID_RE.search(component_text or "")
    if m:
        return m.group(1).strip()
    digest = hashlib.md5((component_text or "").encode("utf-8")).hexdigest()[:16]
    return "%s%s" % (prefix, digest)
