"""
services/analysis_service.py
=============================
Estimation immobilière sans LLM : wraps tools/analysis.py avec logging structuré.
"""

import logging

from domain.tools.analysis import analyser_bien

logger = logging.getLogger(__name__)


async def estimer_bien(
    adresse: str,
    code_postal: int,
    ville: str,
    surface_m2: float,
    statut: str,
    type_bien: str,
    orientation: str,
    taille_terrain: float,
) -> dict:
    """
    Estime le prix d'un bien dans le Nord (59) via l'algorithme DVF géographique.

    Raises:
        ValueError: adresse introuvable, données DVF insuffisantes pour le secteur.
        RuntimeError: échec du géocodage ou de la base de données.
    """
    logger.info(
        "Estimation demandée | adresse=%r | ville=%s | surface=%.0f m² | type=%s | statut=%s",
        adresse, ville, surface_m2, type_bien, statut,
    )

    try:
        result = await analyser_bien(
            adresse=adresse,
            code_postal=code_postal,
            ville=ville,
            surface_m2=surface_m2,
            statut=statut,
            type_bien=type_bien,
            orientation=orientation,
            taille_terrain=taille_terrain,
        )
    except ValueError as exc:
        logger.warning(
            "Estimation impossible | adresse=%r | ville=%s | raison=%s",
            adresse, ville, exc,
        )
        raise
    except RuntimeError as exc:
        logger.error(
            "Erreur infrastructure lors de l'estimation | adresse=%r | erreur=%s",
            adresse, exc,
            exc_info=True,
        )
        raise
    except Exception as exc:
        logger.error(
            "Erreur inattendue lors de l'estimation | type=%s | adresse=%r | erreur=%s",
            type(exc).__name__, adresse, exc,
            exc_info=True,
        )
        raise RuntimeError(f"Erreur interne : {exc}") from exc

    estimation = result.get("estimation", {})
    logger.info(
        "Estimation réussie | ville=%s | prix_total=%d € | prix_m2=%.0f €/m²",
        ville,
        estimation.get("prix_total_estime", 0),
        estimation.get("prix_m2_estime", 0),
    )
    return result
