"""Isócrona de un punto via Valhalla routing engine."""

from __future__ import annotations

import httpx


def valhalla_isochrone(
    lat: float,
    lon: float,
    minutes: int,
    base_url: str = "http://localhost:8002",
    costing: str = "auto",
    denoise: float = 0.6,
    generalize_m: int = 50,
    polygons: bool = True,
    timeout_s: float = 120.0,
) -> dict | None:
    """Calcula la isócrona de un punto usando Valhalla.

    Args:
        lat: Latitud del punto de origen.
        lon: Longitud del punto de origen.
        minutes: Tiempo de viaje en minutos para el contorno.
        base_url: URL base del servidor Valhalla.
        costing: Modelo de coste ('auto', 'bicycle', 'pedestrian', etc.).
        denoise: Factor de suavizado del contorno (0-1). Por defecto 0.6.
        generalize_m: Tolerancia de generalización en metros. Por defecto 50.
        polygons: Si True retorna polígono; si False retorna línea.
        timeout_s: Timeout en segundos. Por defecto 120.

    Returns:
        GeoJSON dict con la isócrona o None si error.
    """
    url = f"{base_url.rstrip('/')}/isochrone"
    payload = {
        "locations": [{"lat": lat, "lon": lon}],
        "costing": costing,
        "contours": [{"time": minutes}],
        "polygons": polygons,
        "denoise": denoise,
        "generalize": generalize_m,
        "format": "geojson",
    }
    try:
        r = httpx.post(url, json=payload, timeout=httpx.Timeout(timeout_s))
        r.raise_for_status()
        return r.json()
    except Exception:
        return None
