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<E> {
  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<E>[] {
  const byId = new Map(exercises.map((e) => [e.id, e]));
  const out: PrefillExercise<E>[] = [];
  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;
}
