"""HTTP routes for planned leave days (calendar planning).""" from datetime import date from uuid import UUID from fastapi import APIRouter, HTTPException, Query, status from app.dependencies import CurrentUserDep, PlanningServiceDep from app.models.planned_leave import ( PlannedLeaveDayCreate, PlannedLeaveDayResponse, ) from app.utils.errors import NotFoundError, ValidationError router = APIRouter(prefix="/api/planned-days", tags=["planned-days"]) def _to_response(day) -> PlannedLeaveDayResponse: return PlannedLeaveDayResponse.from_entity(day) @router.post("", response_model=PlannedLeaveDayResponse, status_code=status.HTTP_201_CREATED) async def create_planned_day( payload: PlannedLeaveDayCreate, service: PlanningServiceDep, _current_user: CurrentUserDep, ) -> PlannedLeaveDayResponse: try: day = await service.add_planned_day( workspace_id=payload.workspace_id, child_id=payload.child_id, parent_personal_data_uuid=payload.parent_personal_data_uuid, date=payload.date, day_type=payload.day_type, is_dubbeldag=payload.is_dubbeldag, ) return _to_response(day) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_ENTITY, str(exc)) from exc @router.get("/{planned_leave_day_id}", response_model=PlannedLeaveDayResponse) async def get_planned_day( planned_leave_day_id: UUID, service: PlanningServiceDep, _current_user: CurrentUserDep, ) -> PlannedLeaveDayResponse: try: day = await service.get(planned_leave_day_id) return _to_response(day) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc @router.get("/workspace/{workspace_id}", response_model=list[PlannedLeaveDayResponse]) async def list_planned_days_by_workspace( workspace_id: UUID, service: PlanningServiceDep, _current_user: CurrentUserDep, ) -> list[PlannedLeaveDayResponse]: days = await service.list_by_workspace(workspace_id) return [_to_response(d) for d in days] @router.get("/range", response_model=list[PlannedLeaveDayResponse]) async def list_planned_days_by_range( workspace_id: UUID = Query(...), child_id: UUID = Query(...), start_date: date = Query(...), end_date: date = Query(...), service: PlanningServiceDep = None, _current_user: CurrentUserDep = None, ) -> list[PlannedLeaveDayResponse]: # Inject dependencies manually for query parameters # Since we can't easily pass Query params with FastAPI dependencies, # we'll need to inject them differently pass @router.delete("/{planned_leave_day_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_planned_day( planned_leave_day_id: UUID, service: PlanningServiceDep, _current_user: CurrentUserDep, ) -> None: try: await service.remove_planned_day(planned_leave_day_id) except NotFoundError as exc: raise HTTPException(status.HTTP_404_NOT_FOUND, str(exc)) from exc