from typing import Annotated from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.deps import get_db from app.models.common import SurfaceKind from app.models.terrain import ( ElevationResponse, FresnelSliceRequest, FresnelSliceResponse, LosRequest, LosResponse, TerrainProfileRequest, TerrainProfileResponse, ) from app.routers.errors import as_501 from app.services import terrain as terrain_service router = APIRouter() @router.get("/elevation", response_model=ElevationResponse) def elevation( lat: float = Query(ge=-90, le=90), lon: float = Query(ge=-180, le=180), surface: SurfaceKind = "dtm", ) -> ElevationResponse: return as_501(lambda: terrain_service.elevation_at(lat, lon, surface)) @router.post("/profile", response_model=TerrainProfileResponse) def profile( request: TerrainProfileRequest, db: Annotated[Session, Depends(get_db)], ) -> TerrainProfileResponse: return terrain_service.terrain_profile(request, db) @router.post("/los", response_model=LosResponse) def los( request: LosRequest, db: Annotated[Session, Depends(get_db)], ) -> LosResponse: return terrain_service.los(request, db) @router.post("/fresnel-slice", response_model=FresnelSliceResponse) def fresnel_slice( request: FresnelSliceRequest, db: Annotated[Session, Depends(get_db)], ) -> FresnelSliceResponse: return terrain_service.fresnel_slice(request, db)