"""HTTP routes for the Swedish calendar (röda dagar / klämdagar). Routers stay thin: validate via Pydantic/query params, call the service, map domain errors to HTTP. Serves both §3.4 (Kalender shading) and §3.8 (Settings red-days list) from one endpoint — see `app.services.calendar_service`. """ from uuid import UUID from fastapi import APIRouter, HTTPException, Query, status from app.dependencies import CalendarServiceDep, WorkspaceScopeDep from app.models.calendar import CalendarDaysResponse from app.services.calendar_service import MAX_WINDOW_YEARS from app.utils.errors import ValidationError router = APIRouter(prefix="/api/calendar", tags=["calendar"]) @router.get("/days", response_model=CalendarDaysResponse) async def get_calendar_days( workspace_id: UUID, start_year: int, service: CalendarServiceDep, scope: WorkspaceScopeDep, years: int = Query(default=MAX_WINDOW_YEARS, ge=1, le=MAX_WINDOW_YEARS), ) -> CalendarDaysResponse: scope.check_workspace(workspace_id) try: window = await service.get_calendar_window( workspace_id=workspace_id, start_year=start_year, years=years ) except ValidationError as exc: raise HTTPException(status.HTTP_422_UNPROCESSABLE_CONTENT, str(exc)) from exc return CalendarDaysResponse.from_domain(window)