"""Wyszukiwarka miejsca i strefa czasowa (proxy OSM/Nominatim).""" from __future__ import annotations from datetime import timezone from fastapi import HTTPException, Query import httpx from app.features import Feature from app.podstawa import (features, app, geocode) # ---------------- Geokoder (proxy OSM/Nominatim dla wyszukiwarki lokalizacji) ---------------- @app.get("/geocode") def geocode_search(q: str = Query("", description="Nazwa / adres / POI do wyszukania")): """Nazwa miejsca → kandydaci ze współrzędnymi (dla pola „Szukaj miejsca").""" try: return {"results": geocode.search(q)} except httpx.HTTPError as e: raise HTTPException(status_code=502, detail=f"Geokoder (OSM) niedostępny: {e}") @app.get("/reverse") def geocode_reverse(lat: float, lon: float): """Punkt z mapy → nazwa miejsca (po przeciągnięciu pineski / kliknięciu).""" try: return geocode.reverse(lat, lon) except httpx.HTTPError as e: raise HTTPException(status_code=502, detail=f"Geokoder (OSM) niedostępny: {e}") @app.get("/timezone") def timezone_lookup(lat: float, lon: float, date: str = "", time: str = "12:00"): """Współrzędne + data → strefa IANA i DST-świadomy offset GMT (PRE-03). Liczone OFFLINE (tzfpy + zoneinfo), więc brak internetu nie przeszkadza. 404, gdy strefy nie da się ustalić — front zostawia wtedy ręczny offset.""" from app import timezone as tzmod res = tzmod.resolve(lat, lon, date, time) if not res: raise HTTPException(status_code=404, detail="Nie ustalono strefy dla tego punktu.") return res # Wyszukiwarka miejsca siedzi na kilku ekranach naraz, więc jej zasoby otwiera # KTÓREKOLWIEK z nich — wymaganie wszystkich byłoby bez sensu. _LOKALIZACJA = frozenset({"chart", "interpret", "timeline"}) _FORMULARZE = frozenset({"chart", "interpret", "timeline", "compile"}) _KOLO = frozenset({"chart", "compile"}) features.zarejestruj( trasy={("GET", "/geocode"): None, ("GET", "/reverse"): None, ("GET", "/timezone"): None}, zasoby={"geo.js": _LOKALIZACJA, "now.js": _LOKALIZACJA, "vendor/leaflet/leaflet.js": _LOKALIZACJA, "vendor/leaflet/leaflet.css": _LOKALIZACJA, "formsync.js": _FORMULARZE, "wheelzoom.js": _KOLO, "wheeltip.js": _KOLO, "copy.js": frozenset({"interpret", "timeline"})}, )