"""Log history routes for viewing past workout sessions. Displays a list of past sessions and detailed logs per session. """ import structlog from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse from sqlmodel import Session from app.database import get_db_session from app.models.user import User from app.services.exercise_service import ExerciseService from app.services.log_service import LogService from app.services.workout_session_service import WorkoutSessionService from app.utils.auth import require_active_profile logger = structlog.get_logger(__name__) router = APIRouter(prefix="/history", tags=["history"]) @router.get("", response_class=HTMLResponse) async def log_history( request: Request, session: Session = Depends(get_db_session), profile: User = Depends(require_active_profile), ): """Display log history for the active profile.""" ws_service = WorkoutSessionService(session) sessions_list = ws_service.list_sessions(user_id=profile.id) # Resolve workout day names for display exercise_service = ExerciseService(session) days_by_id = {d.id: d for d in exercise_service.list_workout_days()} templates = request.app.state.templates return templates.TemplateResponse("pages/log_history.html", { "request": request, "sessions": sessions_list, "days_by_id": days_by_id, "active_profile": profile, }) @router.get("/{session_id}", response_class=HTMLResponse) async def session_detail( session_id: int, request: Request, session: Session = Depends(get_db_session), profile: User = Depends(require_active_profile), ): """Display detailed logs for a specific workout session.""" ws_service = WorkoutSessionService(session) ws = ws_service.get_session_by_id(session_id) log_service = LogService(session) logs = log_service.list_logs_for_session(session_id) # Group logs by exercise exercise_service = ExerciseService(session) exercises_by_id = {} logs_by_exercise = {} for log in logs: if log.exercise_id not in exercises_by_id: exercises_by_id[log.exercise_id] = ( exercise_service.get_exercise_by_id(log.exercise_id) ) logs_by_exercise.setdefault(log.exercise_id, []).append(log) # Resolve workout day name days_by_id = {d.id: d for d in exercise_service.list_workout_days()} templates = request.app.state.templates return templates.TemplateResponse("pages/session_detail.html", { "request": request, "workout_session": ws, "logs_by_exercise": logs_by_exercise, "exercises_by_id": exercises_by_id, "days_by_id": days_by_id, })