import { isCardioExercise } from '@/lib/exerciseOptions'; /** * The ephemeral draft the "today's workout" flow hands to the New Workout * form (via sessionStorage). One entry per exercise, with a working set * count plus a single target weight/reps that we expand into N identical * pre-filled sets. Shared by the producer (GenerateWorkoutClient) and the * consumer (AiWorkoutPrefill) so the shape stays in sync. */ export interface AiWorkoutDraftExercise { exerciseId: string; sets: number; reps?: number; suggestedWeight?: number; suggestedWeightUnit?: 'lbs' | 'kg'; rpe?: number; gear?: number; durationSeconds?: number; notes?: string; } export interface AiWorkoutDraft { name: string; notes?: string; exercises: AiWorkoutDraftExercise[]; } export interface PrefillSet { setNumber: number; reps?: number; weight?: number; rpe?: number; gear?: number; durationSeconds?: number; notes?: string; } export interface PrefillExercise { exercise: E; sets: PrefillSet[]; } /** Default working sets when the model omits a positive count. */ const DEFAULT_SET_COUNT = 3; /** * Expand a draft into pre-filled exercises against the user's library. * * - Exercises whose `exerciseId` isn't in the library are dropped (the * preview forces the user to map them first, so this is just defensive). * - Each exercise becomes `sets` identical SetLogs seeded with the * suggested weight/reps. * - Effort follows the app convention: cardio logs `gear` (1-5), every * other exercise logs `rpe`. We keep only the matching one so a stray * value on the wrong kind never reaches the form. * - The coaching note rides only on the first set (avoids N copies). */ export function buildPrefillExercises< E extends { id: string; type?: string | null; muscleGroups?: string | null }, >(draft: AiWorkoutDraft, exercises: E[]): PrefillExercise[] { const byId = new Map(exercises.map((e) => [e.id, e])); const out: PrefillExercise[] = []; for (const d of draft.exercises) { const exercise = byId.get(d.exerciseId); if (!exercise) continue; const cardio = isCardioExercise(exercise); const setCount = d.sets && d.sets > 0 ? d.sets : DEFAULT_SET_COUNT; const sets: PrefillSet[] = Array.from({ length: setCount }, (_, i) => ({ setNumber: i + 1, reps: d.reps, weight: d.suggestedWeight, rpe: cardio ? undefined : d.rpe, gear: cardio ? d.gear : undefined, durationSeconds: d.durationSeconds, notes: i === 0 ? d.notes : undefined, })); out.push({ exercise, sets }); } return out; }