"""Progress dashboard routes. Displays summary statistics, volume charts, and per-exercise progress. """ import json 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.analytics_service import AnalyticsService from app.services.exercise_service import ExerciseService from app.services.progression_service import ProgressionService from app.utils.auth import require_active_profile logger = structlog.get_logger(__name__) router = APIRouter(prefix="/dashboard", tags=["dashboard"]) @router.get("", response_class=HTMLResponse) async def dashboard( request: Request, session: Session = Depends(get_db_session), profile: User = Depends(require_active_profile), ): """Render the progress dashboard for the active profile.""" analytics = AnalyticsService(session) stats = analytics.get_user_stats(profile.id) volume_data = analytics.get_volume_by_day(profile.id) exercise_service = ExerciseService(session) exercises = exercise_service.list_exercises() templates = request.app.state.templates return templates.TemplateResponse("pages/dashboard.html", { "request": request, "stats": stats, "volume_data_json": json.dumps(volume_data), "exercises": exercises, "active_profile": profile, }) @router.get("/exercise/{exercise_id}", response_class=HTMLResponse) async def exercise_progress( exercise_id: int, request: Request, session: Session = Depends(get_db_session), profile: User = Depends(require_active_profile), ): """Render per-exercise progress page with charts and suggestions.""" exercise_service = ExerciseService(session) exercise = exercise_service.get_exercise_by_id(exercise_id) analytics = AnalyticsService(session) progress_data = analytics.get_exercise_progress( profile.id, exercise_id, ) progression = ProgressionService(session) suggestion = progression.get_suggestion( profile.id, exercise_id, ) templates = request.app.state.templates return templates.TemplateResponse("pages/exercise_progress.html", { "request": request, "exercise": exercise, "progress_data_json": json.dumps(progress_data), "suggestion": suggestion, "active_profile": profile, })