"""Single source of truth for 'what is this workout day' copy (calendar + API).""" from __future__ import annotations from sqlmodel import Session from tracker.models import Exercise, ProgramExercise def build_program_day_summary_lines( day_exercises: list[ProgramExercise], session: Session, ) -> list[str]: """Bullet lines in program order (same grouping rules as the workout UI).""" lines: list[str] = [] idx = 0 while idx < len(day_exercises): pe = day_exercises[idx] exercise = session.get(Exercise, pe.exercise_id) if exercise is None: idx += 1 continue one = f"{exercise.name}: {pe.target_sets}x{pe.target_rep_min}-{pe.target_rep_max}" if pe.superset_group is None: lines.append(f"- {one}") idx += 1 continue group_id = pe.superset_group chunk: list[str] = [one] idx += 1 while idx < len(day_exercises) and day_exercises[idx].superset_group == group_id: pe2 = day_exercises[idx] ex2 = session.get(Exercise, pe2.exercise_id) if ex2 is None: idx += 1 continue chunk.append(f"{ex2.name}: {pe2.target_sets}x{pe2.target_rep_min}-{pe2.target_rep_max}") idx += 1 if len(chunk) > 1: lines.append("- SUPERSET: " + " / ".join(chunk)) else: lines.append(f"- {chunk[0]}") return lines def build_program_day_summary_text( day_exercises: list[ProgramExercise], session: Session, *, tracker_base_url: str | None, ) -> str: """Plain text block. Optional tracker URL line matches calendar scheduling.""" body = "\n".join(build_program_day_summary_lines(day_exercises, session)) if tracker_base_url is None or tracker_base_url == "": return body base = tracker_base_url.rstrip("/") return f"{body}\n\nTracker: {base}/"