"""Wrapper de huggingface_hub.snapshot_download con manejo de ImportError descriptivo."""

from __future__ import annotations


def hf_snapshot_download(
    repo_id: str,
    allow_patterns: list[str] | None = None,
    ignore_patterns: list[str] | None = None,
    local_dir: str | None = None,
    token: str | None = None,
) -> str:
    """Descarga un snapshot completo (o filtrado) de un repo de HuggingFace Hub.

    Wrapper sobre `huggingface_hub.snapshot_download` con manejo de ImportError
    descriptivo. Si `local_dir` se especifica, el snapshot se descarga alli en
    lugar del cache global de HuggingFace (~/.cache/huggingface/).

    Args:
        repo_id: identificador del repositorio en HuggingFace Hub
                 (ej: "runwayml/stable-diffusion-v1-5", "meta-llama/Llama-2-7b-hf").
        allow_patterns: lista opcional de patrones glob para incluir solo ciertos
                        archivos (ej: ["*.safetensors", "*.json"]).
                        Si None, se descargan todos los archivos.
        ignore_patterns: lista opcional de patrones glob para excluir archivos
                         (ej: ["*.bin", "flax_*"]). Util para evitar descargar
                         pesos en formato pytorch si ya se tienen en safetensors.
        local_dir: directorio local donde guardar el snapshot. Si None, usa
                   el cache global de HuggingFace Hub.
        token: token de acceso a HuggingFace (para repos privados o con gated
               access como Llama). Si None, usa HF_TOKEN del entorno.

    Returns:
        Path local (str) donde quedo almacenado el snapshot.

    Raises:
        ImportError: si huggingface_hub no esta instalado, con sugerencia de instalacion.
        Exception: cualquier error de red o autenticacion propagado desde snapshot_download.
    """
    try:
        from huggingface_hub import snapshot_download
    except ImportError as exc:
        raise ImportError(
            "huggingface_hub no esta instalado. "
            "Instalar con: pip install huggingface_hub"
        ) from exc

    kwargs: dict = {"repo_id": repo_id}
    if allow_patterns is not None:
        kwargs["allow_patterns"] = allow_patterns
    if ignore_patterns is not None:
        kwargs["ignore_patterns"] = ignore_patterns
    if local_dir is not None:
        kwargs["local_dir"] = local_dir
    if token is not None:
        kwargs["token"] = token

    result = snapshot_download(**kwargs)
    return str(result)
