from __future__ import annotations

import os
from typing import Any
from urllib.parse import urlencode

import httpx


class ApiGeoClient:
    def __init__(self, base_url: str | None = None, timeout: float = 20.0):
        self.base_url = (base_url or os.getenv("API_GEO_BASE_URL") or "https://geo.api.gouv.fr").rstrip("/")
        self.timeout = timeout

    def _get(self, path: str, params: dict[str, Any] | None = None) -> Any:
        url = f"{self.base_url}{path}"
        with httpx.Client(timeout=self.timeout, follow_redirects=True) as client:
            response = client.get(url, params=params)
            response.raise_for_status()
            return response.json()

    def epci(self, code: str) -> dict[str, Any]:
        return self._get(f"/epcis/{code}", {"fields": "nom,code,population"})

    def epci_communes(self, code: str) -> list[dict[str, Any]]:
        return self._get(
            f"/epcis/{code}/communes",
            {"fields": "nom,code,codesPostaux,population,centre,departement,region", "format": "json"},
        )

    def commune(self, code: str) -> dict[str, Any]:
        return self._get(
            f"/communes/{code}",
            {"fields": "nom,code,codesPostaux,population,centre,contour,departement,region", "format": "json", "geometry": "contour"},
        )

    def communes_by_department(self, dep: str) -> list[dict[str, Any]]:
        return self._get(
            "/communes",
            {"codeDepartement": dep, "fields": "nom,code,population,centre,departement,region", "format": "json"},
        )
