from typing import Dict, Any

from .client import fetch_abn_xml
from .parser import parse_abn_v1
from .models import AbnRecordV1, AbnLookupError


def _normalize_abn(abn: str) -> str:
    """
    Normaliza y valida el ABN.
    - Elimina espacios.
    - Verifica que tenga exactamente 11 dígitos numéricos.
    """
    abn = abn.replace(" ", "")
    if not abn.isdigit() or len(abn) != 11:
        raise AbnLookupError("El ABN debe tener exactamente 11 dígitos numéricos.")
    return abn


def lookup_abn_v1(abn: str, include_history: bool = False) -> Dict[str, Any]:
    """
    Función de alto nivel (versión 1) para usar desde otras apps.

    - Normaliza y valida el ABN.
    - Llama al servicio ABR (SearchByABNv202001).
    - Parsea el XML con parse_abn_v1.
    - Devuelve un dict JSON-friendly (campos básicos).
    """
    norm_abn = _normalize_abn(abn)
    xml_str = fetch_abn_xml(norm_abn, include_history=include_history)
    record: AbnRecordV1 = parse_abn_v1(xml_str)
    return record.to_dict()

