"""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 get_current_admin_user, get_active_profile_id 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), admin: User = Depends(get_current_admin_user), ): """Display log history for the active profile. Shows a list of past workout sessions, most recent first. Args: request: The incoming HTTP request. session: Database session. admin: The authenticated admin user. Returns: Rendered log history page. """ active_profile_id = get_active_profile_id(request) active_profile = ( session.get(User, active_profile_id) if active_profile_id else None ) sessions_list = [] if active_profile_id: ws_service = WorkoutSessionService(session) sessions_list = ws_service.list_sessions(user_id=active_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": active_profile, "admin": admin, }) @router.get("/{session_id}", response_class=HTMLResponse) async def session_detail( session_id: int, request: Request, session: Session = Depends(get_db_session), admin: User = Depends(get_current_admin_user), ): """Display detailed logs for a specific workout session. Args: session_id: The workout session ID. request: The incoming HTTP request. session: Database session. admin: The authenticated admin user. Returns: Rendered session detail page. """ 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, "admin": admin, })