import random from typing import Iterable, Optional def section_exercise_count(section: str, fitness_level: int, rng=random) -> int: """Return section exercise count range by fitness level.""" level = fitness_level or 2 if section == 'warmup': if level <= 1: return rng.randint(5, 7) if level >= 3: return rng.randint(3, 5) return rng.randint(4, 6) if section == 'cooldown': if level <= 1: return rng.randint(4, 5) if level >= 3: return rng.randint(2, 3) return rng.randint(3, 4) raise ValueError(f'Unknown section: {section}') def rounded_duration( raw_duration: int, *, min_duration: int, duration_multiple: int, ) -> int: """Round duration to configured multiple and clamp to minimum.""" return max(min_duration, round(raw_duration / duration_multiple) * duration_multiple) def build_duration_entries( exercises: Iterable, *, duration_min: int, duration_max: int, min_duration: int, duration_multiple: int, rng=random, ) -> list[dict]: """Build ordered duration entries from exercises.""" entries = [] for idx, ex in enumerate(exercises, start=1): duration = rng.randint(duration_min, duration_max) entries.append({ 'exercise': ex, 'duration': rounded_duration( duration, min_duration=min_duration, duration_multiple=duration_multiple, ), 'order': idx, }) return entries def build_section_superset(name: str, entries: list[dict]) -> Optional[dict]: """Build a single-round warmup/cooldown superset payload.""" if not entries: return None return { 'name': name, 'rounds': 1, 'rest_between_rounds': 0, 'exercises': entries, }