import type { UUID } from 'crypto'; import type { WorkoutExerciseCTO } from '../../../ctos/workout/WorkoutExerciseCTO.js'; import type { WorkoutMuscleGroupVolumeCTO, WorkoutVolumeLandmarkEstimate } from '../../../ctos/workout/WorkoutMuscleGroupVolumeCTO.js'; import type { WorkoutEquipmentType } from '../../../documents/workout/WorkoutEquipmentType.js'; import type { WorkoutExercise } from '../../../documents/workout/WorkoutExercise.js'; import type { WorkoutMesocycle } from '../../../documents/workout/WorkoutMesocycle.js'; import type { WorkoutMicrocycle } from '../../../documents/workout/WorkoutMicrocycle.js'; import type { WorkoutSession } from '../../../documents/workout/WorkoutSession.js'; import type { WorkoutSessionExercise } from '../../../documents/workout/WorkoutSessionExercise.js'; import type { WorkoutSet } from '../../../documents/workout/WorkoutSet.js'; /** * Central shared context for generating or updating a {@link WorkoutMesocycle}. * * This keeps the generation pipeline (Mesocycle -> Microcycle -> Session -> Set) from needing to * thread the same inputs (mesocycle config + document lookups + optional historical docs) through * every method. */ export default class WorkoutMesocyclePlanContext { #private; mesocycle: WorkoutMesocycle; existingMicrocycles: WorkoutMicrocycle[]; existingSessions: WorkoutSession[]; existingSessionExercises: WorkoutSessionExercise[]; existingSets: WorkoutSet[]; /** * The target RIR for the first microcycle of the mesocycle. Varies by cycle * type: MuscleGain starts at 4, Cut starts at 3, Resensitization stays at 3. */ readonly firstMicrocycleRir: number; /** * Number of microcycles between each baseline set addition. * MuscleGain = 1 (every microcycle), Cut = 2 (every other), Resensitization = 0 (never). */ readonly progressionInterval: number; /** * Whether this mesocycle type skips the deload microcycle. True for * Resensitization cycles. */ readonly skipDeload: boolean; /** * Number of accumulation (non-deload) microcycles in this mesocycle. * Equal to the total planned count when deload is skipped, or total minus one otherwise. */ readonly accumulationMicrocycleCount: number; readonly exerciseMap: Map; readonly equipmentMap: Map; readonly sessionMap: Map; readonly sessionExerciseMap: Map; readonly setMap: Map; readonly microcyclesToCreate: WorkoutMicrocycle[]; /** * All microcycles for this mesocycle in chronological order. * * This includes any existing microcycles (filtered to the target mesocycle) and * all newly generated microcycles. */ readonly microcyclesInOrder: WorkoutMicrocycle[]; readonly sessionsToCreate: WorkoutSession[]; readonly sessionExercisesToCreate: WorkoutSessionExercise[]; readonly setsToCreate: WorkoutSet[]; /** * The array of sessions corresponding to the array of exercise CTOs, in order, * for that session. */ plannedSessionExerciseCTOs: WorkoutExerciseCTO[][] | undefined; /** * Stores the mesocycle's muscle-group-wide exercise ordering. * * This is used by session generation to distribute set progression evenly across * exercises that share a primary muscle group, regardless of which session they * ended up in. */ muscleGroupToExerciseCTOsMap: Map | undefined; /** * Maps muscle group ID to its estimated volume landmarks (MEV, MRV, MAV). * Populated from WorkoutMuscleGroupVolumeCTOs when provided. */ muscleGroupToVolumeLandmarkMap: Map; exerciseIdToSessionIndex: Map | undefined; /** * Creates a new workout mesocycle planning context. */ constructor(mesocycle: WorkoutMesocycle, exerciseCTOs: WorkoutExerciseCTO[], volumeCTOs?: WorkoutMuscleGroupVolumeCTO[], existingMicrocycles?: WorkoutMicrocycle[], existingSessions?: WorkoutSession[], existingSessionExercises?: WorkoutSessionExercise[], existingSets?: WorkoutSet[]); /** * Adds a microcycle to the list of microcycles to create and the overall chronological list. */ addMicrocycle(toCreate: WorkoutMicrocycle): void; /** * Adds a session to the context and updates internal maps. */ addSession(session: WorkoutSession): void; /** * Adds a session exercise to the context and updates internal maps. */ addSessionExercise(sessionExercise: WorkoutSessionExercise): void; /** * Adds sets to the context and updates the set map for O(1) lookup. */ addSets(sets: WorkoutSet[]): void; /** * Stores the planned session -> exercises structure for the mesocycle and derives * the muscle-group-wide ordering used for set progression. */ setPlannedSessionExerciseCTOs(plannedSessionExerciseCTOs: WorkoutExerciseCTO[][]): void; } //# sourceMappingURL=WorkoutMesocyclePlanContext.d.ts.map