"""Diaper change log management router.""" from typing import Annotated from fastapi import APIRouter, HTTPException, Depends from baby_monitor.models.diaper_change import ( CreateDiaperChangeRequest, UpdateDiaperChangeRequest, DiaperChangeResponse, ) from baby_monitor.routers.auth import verify_token from baby_monitor.repositories.interfaces import ( DiaperChangeRepositoryInterface, ChildRepositoryInterface, ) from baby_monitor.repositories.dependencies import ( get_diaper_change_repository, get_child_repository, ) from baby_monitor.utils.verify_child_access import verify_child_access router = APIRouter(prefix="/api/diaper-changes", tags=["diaper-changes"]) @router.post("", response_model=DiaperChangeResponse, status_code=201) def create_diaper_change( request: CreateDiaperChangeRequest, user_id: Annotated[int, Depends(verify_token)], diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Create a new diaper change log entry.""" # Verify the child belongs to the authenticated user verify_child_access(child_repo, request.child_id, user_id) diaper_change = diaper_repo.create( child_id=request.child_id, change_time=request.change_time, poop_amount=request.poop_amount.value if request.poop_amount else None, poop_color=request.poop_color.value if request.poop_color else None, pee_amount=request.pee_amount.value if request.pee_amount else None, pee_color=request.pee_color.value if request.pee_color else None, ) return DiaperChangeResponse(**diaper_change) @router.get("", response_model=list[DiaperChangeResponse]) def get_user_diaper_changes( user_id: Annotated[int, Depends(verify_token)], diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], ) -> list[DiaperChangeResponse]: """Get all diaper change logs for the authenticated user's children.""" diaper_changes = diaper_repo.get_by_user_id(user_id) return [DiaperChangeResponse(**dc) for dc in diaper_changes] @router.get("/{diaper_change_id}", response_model=DiaperChangeResponse) def get_diaper_change( diaper_change_id: int, user_id: Annotated[int, Depends(verify_token)], diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Get a specific diaper change log by ID.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) if not diaper_change: raise HTTPException(status_code=404, detail="Diaper change log not found") # Verify the diaper change belongs to user's child verify_child_access(child_repo, diaper_change["child_id"], user_id) return DiaperChangeResponse(**diaper_change) @router.put("/{diaper_change_id}", response_model=DiaperChangeResponse) def update_diaper_change( diaper_change_id: int, request: UpdateDiaperChangeRequest, user_id: Annotated[int, Depends(verify_token)], diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Update an existing diaper change log.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) if not diaper_change: raise HTTPException(status_code=404, detail="Diaper change log not found") # Verify the diaper change belongs to user's child verify_child_access(child_repo, diaper_change["child_id"], user_id) updated = diaper_repo.update( diaper_change_id=diaper_change_id, change_time=request.change_time, poop_amount=request.poop_amount.value if request.poop_amount else None, poop_color=request.poop_color.value if request.poop_color else None, pee_amount=request.pee_amount.value if request.pee_amount else None, pee_color=request.pee_color.value if request.pee_color else None, ) if not updated: raise HTTPException( status_code=500, detail="Failed to update diaper change log" ) return DiaperChangeResponse(**updated) @router.delete("/{diaper_change_id}", status_code=204) def delete_diaper_change( diaper_change_id: int, user_id: Annotated[int, Depends(verify_token)], diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> None: """Delete a diaper change log.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) if not diaper_change: raise HTTPException(status_code=404, detail="Diaper change log not found") # Verify the diaper change belongs to user's child verify_child_access(child_repo, diaper_change["child_id"], user_id) success = diaper_repo.delete(diaper_change_id) if not success: raise HTTPException( status_code=500, detail="Failed to delete diaper change log" )