"""Orquestador OSINT pasivo: perfil de una organizacion por su dominio.

Compone funciones atomicas del registro (`whois_lookup`, `dns_records`,
`enum_subdomains_crtsh`) para construir un perfil pasivo de una organizacion a
partir de su dominio, usando solo fuentes publicas (WHOIS, DNS, Certificate
Transparency via crt.sh) sin contactar directamente con la infraestructura del
objetivo mas alla de las consultas DNS estandar.

Funcion IMPURA: hace consultas de red (WHOIS, DNS, HTTP a crt.sh).
"""

from cybersecurity import dns_records, enum_subdomains_crtsh, whois_lookup


def enrich_org_passive(dominio: str) -> dict:
    """Construye un perfil OSINT pasivo de una organizacion por su dominio.

    Agrega tres fuentes publicas: el registro WHOIS del dominio, sus registros
    DNS y los subdominios observados en Certificate Transparency (crt.sh).

    Args:
        dominio: dominio de la organizacion, p.ej. `organic-machine.com`.

    Returns:
        dict con las claves:
          - whois: salida de whois_lookup(dominio).
          - dns: salida de dns_records(dominio).
          - subdomains: salida de enum_subdomains_crtsh(dominio).

    Raises:
        ValueError: si el dominio esta vacio.
    """
    if not (dominio or "").strip():
        raise ValueError("dominio no puede estar vacio")

    dominio = dominio.strip()

    # Resiliente a fallo parcial: si una fuente externa falla (p.ej. crt.sh lento o
    # rate-limitado), se registra el error y se devuelven las demas igualmente.
    result = {"whois": {}, "dns": {}, "subdomains": [], "errors": {}}
    for key, fn in (("whois", whois_lookup), ("dns", dns_records),
                    ("subdomains", enum_subdomains_crtsh)):
        try:
            result[key] = fn(dominio)
        except Exception as exc:  # noqa: BLE001 — captura amplia a proposito por fuente
            result["errors"][key] = f"{type(exc).__name__}: {exc}"
    return result
