from __future__ import annotations from typing import Any, Dict from fastapi import APIRouter, Depends, HTTPException, Request from app.engine import DuckDBEngine from app.models import EventCreateRequest, EventStopRequest, GarminSyncRequest router = APIRouter(tags=["Events"]) def get_engine(request: Request) -> DuckDBEngine: return request.app.state.engine @router.post("/events") async def add_event( req: EventCreateRequest, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: try: return engine.add_event(req) except ValueError as ve: raise HTTPException(status_code=400, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/events/stop") async def stop_event( req: EventStopRequest, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: try: return engine.stop_event(req) except ValueError as ve: raise HTTPException(status_code=400, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.delete("/events/{event_id}") async def delete_event( event_id: str, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: try: return engine.delete_event(event_id) except ValueError as ve: raise HTTPException(status_code=404, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/garmin/sync") async def sync_garmin( req: GarminSyncRequest, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: try: return engine.sync_garmin(req) except ValueError as ve: raise HTTPException(status_code=400, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e))