"""
Utgående, lesende HTTP-klient mot teeoff sitt offentlige facilities-API
(ADR-004/ADR-019). Ren HTTP-modul -- ingen db/RLS-avhengighet, samme
isolasjonsprinsipp som handicap_engine.py.

Server-til-server: teecup_api snakker med teeoff_api direkte over det delte
Docker-nettverket (teeoff_default), ikke via Caddy/det offentlige domenet.
Endepunktene (`/api/facilities`, `/api/facilities/{slug}`) er offentlige i
teeoff -- ingen auth-mekanisme finnes der, så ingen hemmelighet trengs her.
"""

import httpx

from .config import settings

_TIMEOUT = httpx.Timeout(10.0, connect=5.0)


class TeeoffUnavailableError(Exception):
    """Teeoff svarte ikke (nede, timeout, uventet statuskode)."""


class TeeoffNotFoundError(Exception):
    """Anlegget finnes ikke i teeoff (404)."""


async def search_facilities(query: str) -> list[dict]:
    """`?view=search` gir en lettvekts liste (id/slug/name/city/county/...)
    egnet for søk -- filtrerer på navn her, teeoff har ingen egen
    søkeparameter på dette endepunktet."""
    url = f"{settings.TEEOFF_API_BASE_URL}/api/facilities"
    try:
        async with httpx.AsyncClient(timeout=_TIMEOUT) as client:
            res = await client.get(url, params={"view": "search"})
    except httpx.HTTPError as e:
        raise TeeoffUnavailableError(str(e)) from e
    if res.status_code != 200:
        raise TeeoffUnavailableError(f"uventet status {res.status_code}")

    facilities: list[dict] = res.json()
    q = query.strip().lower()
    if not q:
        return facilities
    return [f for f in facilities if q in (f.get("name") or "").lower()]


async def get_facility(slug: str) -> dict:
    url = f"{settings.TEEOFF_API_BASE_URL}/api/facilities/{slug}"
    try:
        async with httpx.AsyncClient(timeout=_TIMEOUT) as client:
            res = await client.get(url)
    except httpx.HTTPError as e:
        raise TeeoffUnavailableError(str(e)) from e
    if res.status_code == 404:
        raise TeeoffNotFoundError(slug)
    if res.status_code != 200:
        raise TeeoffUnavailableError(f"uventet status {res.status_code}")
    return res.json()
