import * as mongoose from 'mongoose';
import * as dotenv from 'dotenv';
dotenv.config();

// Category key → { en name, fields }
const categoryDefs = [
  {
    key: 'weight_and_reps',
    name: { en: 'Weight & Reps', de: 'Gewicht & Wdh.' },
    fields: [
      { key: 'weight', label: { en: 'Weight', de: 'Gewicht' }, unit: 'kg',  type: 'number' },
      { key: 'reps',   label: { en: 'Reps',   de: 'Wdh.'    }, unit: '',    type: 'number' },
    ],
  },
  {
    key: 'reps_only',
    name: { en: 'Reps Only', de: 'Nur Wdh.' },
    fields: [
      { key: 'reps', label: { en: 'Reps', de: 'Wdh.' }, unit: '', type: 'number' },
    ],
  },
  {
    key: 'time_hold',
    name: { en: 'Time / Hold Time', de: 'Zeit / Haltezeit' },
    fields: [
      { key: 'duration', label: { en: 'Duration', de: 'Dauer' }, unit: 'min', type: 'time' },
    ],
  },
  {
    key: 'distance_and_time',
    name: { en: 'Distance & Time', de: 'Distanz & Zeit' },
    fields: [
      { key: 'distance', label: { en: 'Distance', de: 'Distanz' }, unit: 'km',  type: 'number' },
      { key: 'duration', label: { en: 'Time',     de: 'Zeit'    }, unit: 'min', type: 'time'   },
    ],
  },
  {
    key: 'assisted_bodyweight',
    name: { en: 'Assisted Bodyweight', de: 'Unterstütztes Körpergewicht' },
    fields: [
      { key: 'assisted_weight', label: { en: 'Assistance', de: 'Unterstützung' }, unit: 'kg', type: 'number' },
      { key: 'reps',            label: { en: 'Reps',       de: 'Wdh.'          }, unit: '',   type: 'number' },
    ],
  },
  {
    key: 'weighted_bodyweight',
    name: { en: 'Weighted Bodyweight', de: 'Gewichtetes Körpergewicht' },
    fields: [
      { key: 'added_weight', label: { en: 'Added Weight', de: 'Zusatzgewicht'  }, unit: 'kg', type: 'number' },
      { key: 'reps',         label: { en: 'Reps',         de: 'Wdh.'          }, unit: '',   type: 'number' },
    ],
  },
];

// Body-part english name → german name. `body` refs below use the english name as key.
const bodyPartDefs = [
  { name: { en: 'Chest',       de: 'Brust' } },
  { name: { en: 'Back',        de: 'Rücken' } },
  { name: { en: 'Lats',        de: 'Latissimus' } },
  { name: { en: 'Lower Back',  de: 'Unterer Rücken' } },
  { name: { en: 'Trapezius',   de: 'Trapezmuskel' } },
  { name: { en: 'Shoulders',   de: 'Schultern' } },
  { name: { en: 'Biceps',      de: 'Bizeps' } },
  { name: { en: 'Triceps',     de: 'Trizeps' } },
  { name: { en: 'Forearms',    de: 'Unterarme' } },
  { name: { en: 'Abs / Core',  de: 'Bauch / Rumpf' } },
  { name: { en: 'Obliques',    de: 'Seitliche Bauchmuskeln' } },
  { name: { en: 'Glutes',      de: 'Gesäß' } },
  { name: { en: 'Quadriceps',  de: 'Quadrizeps' } },
  { name: { en: 'Hamstrings',  de: 'Oberschenkelrückseite' } },
  { name: { en: 'Calves',      de: 'Waden' } },
  { name: { en: 'Adductors',   de: 'Adduktoren' } },
  { name: { en: 'Abductors',   de: 'Abduktoren' } },
  { name: { en: 'Hip Flexors', de: 'Hüftbeuger' } },
  { name: { en: 'Neck',        de: 'Nacken' } },
  { name: { en: 'Full Body',   de: 'Ganzkörper' } },
  { name: { en: 'Cardio',      de: 'Ausdauer' } },
];

const exercises: { en: string; de: string; desc_en: string; desc_de: string; cat: string; body: string[] }[] = [
  // ── Weight & Reps ──────────────────────────────────────────────────────────
  { en: 'Ab Crunch Machine',                 de: 'Bauchpresse (Maschine)',              cat: 'weight_and_reps', body: ['Abs / Core'], desc_en: 'Machine-based crunch targeting the abdominal muscles with adjustable weight.', desc_de: 'Maschinengestützter Crunch für die Bauchmuskeln mit einstellbarem Gewicht.' },
  { en: 'Abduction (Machine)',               de: 'Abduktion (Maschine)',                cat: 'weight_and_reps', body: ['Abductors', 'Glutes'], desc_en: 'Targets the outer hip and glute muscles using a machine.', desc_de: 'Trainiert äußere Hüft- und Gesäßmuskeln an der Maschine.' },
  { en: 'Adduction (Machine)',               de: 'Adduktion (Maschine)',                cat: 'weight_and_reps', body: ['Adductors'], desc_en: 'Targets the inner thigh muscles using a machine.', desc_de: 'Trainiert die inneren Oberschenkelmuskeln an der Maschine.' },
  { en: 'Back Extension',                    de: 'Rückenstrecker',                      cat: 'weight_and_reps', body: ['Lower Back', 'Glutes', 'Hamstrings'], desc_en: 'Strengthens the lower back, glutes, and hamstrings on a hyperextension bench.', desc_de: 'Stärkt unteren Rücken, Gesäß und Oberschenkelrückseite.' },
  { en: 'Barbell Row',                       de: 'Langhantelrudern',                    cat: 'weight_and_reps', body: ['Back', 'Lats', 'Biceps'], desc_en: 'Compound pulling exercise targeting the back muscles.', desc_de: 'Zusammengesetzte Zugübung für die Rückenmuskulatur.' },
  { en: 'Bench Press',                       de: 'Bankdrücken',                         cat: 'weight_and_reps', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Fundamental chest exercise pressing a barbell or dumbbells from the chest.', desc_de: 'Grundlegende Brustübung mit Lang- oder Kurzhantel.' },
  { en: 'Biceps Curl (Barbell/Dumbbell)',    de: 'Bizepscurl (Langhantel/Kurzhantel)',  cat: 'weight_and_reps', body: ['Biceps', 'Forearms'], desc_en: 'Isolation exercise targeting the biceps.', desc_de: 'Isolationsübung für den Bizeps.' },
  { en: 'Bulgarian Split Squat',             de: 'Bulgarische Kniebeuge',               cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hamstrings'], desc_en: 'Single-leg squat with rear foot elevated targeting quads and glutes.', desc_de: 'Einbeinige Kniebeuge mit erhöhtem Hinterfuß.' },
  { en: 'Cable Crossover',                   de: 'Kabelzug Crossover',                  cat: 'weight_and_reps', body: ['Chest'], desc_en: 'Cable exercise isolating the pectoral muscles.', desc_de: 'Kabelübung zur Isolation der Brustmuskeln.' },
  { en: 'Cable Row',                         de: 'Kabelrudern',                         cat: 'weight_and_reps', body: ['Back', 'Lats', 'Biceps'], desc_en: 'Seated cable pulling exercise for the back.', desc_de: 'Sitzendes Kabelrudern für den Rücken.' },
  { en: 'Chest Fly (Machine)',               de: 'Butterfly (Maschine)',                cat: 'weight_and_reps', body: ['Chest'], desc_en: 'Machine-based chest isolation exercise.', desc_de: 'Maschinengestützte Brustisolationsübung.' },
  { en: 'Chest Press (Machine)',             de: 'Brustpresse (Maschine)',              cat: 'weight_and_reps', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Machine pressing exercise for chest, shoulders, and triceps.', desc_de: 'Maschinendrückübung für Brust, Schultern und Trizeps.' },
  { en: 'Deadlift',                          de: 'Kreuzheben',                          cat: 'weight_and_reps', body: ['Back', 'Glutes', 'Hamstrings', 'Lower Back'], desc_en: 'Powerful compound exercise lifting a barbell from the floor.', desc_de: 'Kraftvolle Verbundübung: Langhantel vom Boden heben.' },
  { en: 'Dumbbell Fly',                      de: 'Kurzhantel Fliegende',                cat: 'weight_and_reps', body: ['Chest'], desc_en: 'Chest isolation exercise on a bench with dumbbells.', desc_de: 'Brustübung auf der Bank mit Kurzhanteln.' },
  { en: 'Face Pulls',                        de: 'Face Pulls',                          cat: 'weight_and_reps', body: ['Shoulders', 'Trapezius'], desc_en: 'Cable exercise strengthening the rear deltoids and rotator cuff.', desc_de: 'Kabelübung für hintere Schulter und Rotatorenmanschette.' },
  { en: 'Front Raise',                       de: 'Frontheben',                          cat: 'weight_and_reps', body: ['Shoulders'], desc_en: 'Shoulder isolation exercise raising a dumbbell in front.', desc_de: 'Schulterübung: Kurzhantel nach vorne heben.' },
  { en: 'Front Squat',                       de: 'Frontkniebeuge',                      cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes'], desc_en: 'Squat variation with barbell at the front shoulders.', desc_de: 'Kniebeugevariante mit Langhantel vor den Schultern.' },
  { en: 'Glute Bridge / Hip Thrust',         de: 'Glutebrücke / Hip Thrust',            cat: 'weight_and_reps', body: ['Glutes', 'Hamstrings'], desc_en: 'Glute-dominant exercise driving the hips upward.', desc_de: 'Gesäßübung: Hüfte nach oben drücken.' },
  { en: 'Goblet Squat',                      de: 'Goblet Kniebeuge',                    cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes'], desc_en: 'Squat holding a dumbbell or kettlebell at the chest.', desc_de: 'Kniebeuge mit Kurzhantel oder Kettlebell vor der Brust.' },
  { en: 'Hack Squat',                        de: 'Hack Kniebeuge',                      cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes'], desc_en: 'Machine squat targeting the quads with back supported.', desc_de: 'Maschinengestützte Kniebeuge für den Quadrizeps.' },
  { en: 'Hammer Curl',                       de: 'Hammercurl',                          cat: 'weight_and_reps', body: ['Biceps', 'Forearms'], desc_en: 'Curl with neutral grip targeting brachialis and biceps.', desc_de: 'Curl mit neutralem Griff für Brachialis und Bizeps.' },
  { en: 'Incline Bench Press',               de: 'Schrägbankdrücken',                   cat: 'weight_and_reps', body: ['Chest', 'Shoulders', 'Triceps'], desc_en: 'Bench press on an inclined bench targeting upper chest.', desc_de: 'Bankdrücken auf geneigter Bank für die obere Brust.' },
  { en: 'Kettlebell Swing',                  de: 'Kettlebell Swing',                    cat: 'weight_and_reps', body: ['Glutes', 'Hamstrings', 'Lower Back'], desc_en: 'Dynamic hip-hinge movement targeting the posterior chain.', desc_de: 'Dynamische Hüftbewegung für die hintere Muskelkette.' },
  { en: 'Lat Pulldown',                      de: 'Latzug',                              cat: 'weight_and_reps', body: ['Lats', 'Back', 'Biceps'], desc_en: 'Cable exercise pulling a bar down to target the lats.', desc_de: 'Kabelübung: Stange nach unten ziehen für den Latissimus.' },
  { en: 'Lateral Raise',                     de: 'Seitenheben',                         cat: 'weight_and_reps', body: ['Shoulders'], desc_en: 'Shoulder isolation raising dumbbells to the sides.', desc_de: 'Schulterübung: Kurzhanteln seitlich heben.' },
  { en: 'Leg Curl (Lying or Seated)',        de: 'Beinbeuger (Liegend oder Sitzend)',   cat: 'weight_and_reps', body: ['Hamstrings'], desc_en: 'Machine exercise isolating the hamstrings.', desc_de: 'Maschinenübung zur Isolation der Oberschenkelrückseite.' },
  { en: 'Leg Extension',                     de: 'Beinstrecker',                        cat: 'weight_and_reps', body: ['Quadriceps'], desc_en: 'Machine-based quad isolation exercise.', desc_de: 'Maschinengestützte Quadrizepsisolation.' },
  { en: 'Leg Press',                         de: 'Beinpresse',                          cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hamstrings'], desc_en: 'Machine exercise pushing a platform with both legs.', desc_de: 'Maschinenübung: Plattform mit beiden Beinen drücken.' },
  { en: 'Lunge (Forward/Reverse/Walking)',   de: 'Ausfallschritt',                      cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hamstrings'], desc_en: 'Unilateral lower body exercise targeting quads and glutes.', desc_de: 'Einseitige Unterkörperübung für Quadrizeps und Gesäß.' },
  { en: 'Military Press (Overhead Press)',   de: 'Militärpress (Schulterdrücken)',      cat: 'weight_and_reps', body: ['Shoulders', 'Triceps'], desc_en: 'Standing overhead barbell press targeting shoulders and triceps.', desc_de: 'Stehender Überkopfdrücker mit Langhantel.' },
  { en: 'Overhead Triceps Extension',        de: 'Trizepsdrücken über Kopf',            cat: 'weight_and_reps', body: ['Triceps'], desc_en: 'Isolation exercise targeting the long head of the triceps.', desc_de: 'Isolationsübung für den langen Trizepskopf.' },
  { en: 'Push Press',                        de: 'Push Press',                          cat: 'weight_and_reps', body: ['Shoulders', 'Triceps', 'Quadriceps'], desc_en: 'Overhead press using leg drive to push a barbell overhead.', desc_de: 'Überkopfdrücken mit Beinhilfe.' },
  { en: 'Reverse Fly (Machine)',             de: 'Reverse Fliegende (Maschine)',        cat: 'weight_and_reps', body: ['Shoulders', 'Trapezius'], desc_en: 'Machine exercise targeting the rear deltoids and upper back.', desc_de: 'Maschinenübung für hintere Schulter und oberen Rücken.' },
  { en: 'Romanian Deadlift (RDL)',           de: 'Rumänisches Kreuzheben',              cat: 'weight_and_reps', body: ['Hamstrings', 'Glutes', 'Lower Back'], desc_en: 'Hip-hinge deadlift emphasizing the hamstrings and glutes.', desc_de: 'Hüftbeuge-Kreuzheben für Oberschenkelrückseite und Gesäß.' },
  { en: 'Seated Row (Cable)',                de: 'Sitzrudern (Kabel)',                  cat: 'weight_and_reps', body: ['Back', 'Lats', 'Biceps'], desc_en: 'Seated cable pulling for the middle back.', desc_de: 'Sitzendes Kabelrudern für den mittleren Rücken.' },
  { en: 'Shoulder Press (Dumbbell/Machine)', de: 'Schulterdrücken (Kurzhantel/Maschine)', cat: 'weight_and_reps', body: ['Shoulders', 'Triceps'], desc_en: 'Overhead pressing exercise targeting the deltoids.', desc_de: 'Überkopfdrückübung für die Deltamuskeln.' },
  { en: 'Single-Leg Deadlift',              de: 'Einbeiniges Kreuzheben',              cat: 'weight_and_reps', body: ['Hamstrings', 'Glutes'], desc_en: 'Balance and strength exercise on one leg targeting hamstrings.', desc_de: 'Balance- und Kraftübung auf einem Bein.' },
  { en: 'Skull Crusher (French Press)',      de: 'Skull Crusher (French Press)',        cat: 'weight_and_reps', body: ['Triceps'], desc_en: 'Lying triceps isolation lowering a barbell toward the forehead.', desc_de: 'Liegende Trizepsisolation: Langhantel zur Stirn senken.' },
  { en: 'Smith Machine Squat',              de: 'Smith Machine Kniebeuge',             cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes'], desc_en: 'Squat on a Smith machine for guided resistance.', desc_de: 'Kniebeuge an der Smith Machine.' },
  { en: 'Split Squat',                      de: 'Split Kniebeuge',                     cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hip Flexors'], desc_en: 'Stationary lunge targeting quads, glutes, and hip flexors.', desc_de: 'Stationärer Ausfallschritt für Quadrizeps und Gesäß.' },
  { en: 'Squat',                            de: 'Kniebeuge',                           cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hamstrings', 'Abs / Core'], desc_en: 'Barbell squat targeting quads, glutes, hamstrings, and core.', desc_de: 'Langhantel-Kniebeuge für Quadrizeps, Gesäß und Rumpf.' },
  { en: 'Sumo Deadlift',                    de: 'Sumo Kreuzheben',                     cat: 'weight_and_reps', body: ['Glutes', 'Adductors', 'Hamstrings', 'Lower Back'], desc_en: 'Wide-stance deadlift targeting inner thighs and glutes.', desc_de: 'Kreuzheben mit breitem Stand für innere Oberschenkel.' },
  { en: 'Triceps Kickback (Cable/Dumbbell)', de: 'Trizeps Kickback (Kabel/Kurzhantel)', cat: 'weight_and_reps', body: ['Triceps'], desc_en: 'Isolation exercise extending the arm backward to target triceps.', desc_de: 'Isolationsübung: Arm nach hinten strecken für den Trizeps.' },
  { en: 'Triceps Pushdown (Cable)',          de: 'Trizepsdrücken (Kabel)',              cat: 'weight_and_reps', body: ['Triceps'], desc_en: 'Cable exercise pushing downward to isolate the triceps.', desc_de: 'Kabelübung: nach unten drücken für den Trizeps.' },
  { en: 'Upright Row',                      de: 'Hochziehen',                          cat: 'weight_and_reps', body: ['Shoulders', 'Trapezius'], desc_en: 'Pulling exercise lifting a barbell up the body targeting traps and delts.', desc_de: 'Zugübung: Langhantel am Körper hochziehen.' },
  { en: 'Walking Lunge',                    de: 'Gehende Ausfallschritte',             cat: 'weight_and_reps', body: ['Quadriceps', 'Glutes', 'Hamstrings'], desc_en: 'Dynamic lunge walking forward targeting quads and glutes.', desc_de: 'Dynamischer Ausfallschritt vorwärts.' },

  // ── Reps Only ──────────────────────────────────────────────────────────────
  { en: 'Bodyweight Squat',   de: 'Kniebeuge (Körpergewicht)', cat: 'reps_only', body: ['Quadriceps', 'Glutes'], desc_en: 'Squat using only bodyweight.', desc_de: 'Kniebeuge nur mit Körpergewicht.' },
  { en: 'Crunches',           de: 'Crunches',                  cat: 'reps_only', body: ['Abs / Core'], desc_en: 'Core exercise curling the upper body toward the knees.', desc_de: 'Kernübung: Oberkörper zu den Knien rollen.' },
  { en: 'Donkey Kicks',       de: 'Eseltritt',                 cat: 'reps_only', body: ['Glutes'], desc_en: 'Glute isolation exercise kicking one leg back and up.', desc_de: 'Gesäßübung: Bein nach hinten oben stoßen.' },
  { en: 'Jump Squat',         de: 'Sprungkniebeuge',           cat: 'reps_only', body: ['Quadriceps', 'Glutes', 'Calves'], desc_en: 'Explosive squat jumping off the ground at the top.', desc_de: 'Explosive Kniebeuge mit Absprung.' },
  { en: 'Mountain Climbers',  de: 'Bergsteiger',               cat: 'reps_only', body: ['Abs / Core', 'Hip Flexors', 'Cardio'], desc_en: 'Cardio and core exercise driving knees toward the chest in plank.', desc_de: 'Ausdauer- und Kernübung: Knie in Plank-Position zur Brust ziehen.' },
  { en: 'Pull-Up',            de: 'Klimmzug',                  cat: 'reps_only', body: ['Lats', 'Back', 'Biceps'], desc_en: 'Bodyweight exercise pulling up to a bar with overhand grip.', desc_de: 'Körpergewichtsübung: an der Stange hochziehen.' },
  { en: 'Push-Up',            de: 'Liegestütz',                cat: 'reps_only', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Classic bodyweight pressing exercise for chest and triceps.', desc_de: 'Klassische Körpergewichtsübung für Brust und Trizeps.' },
  { en: 'Russian Twist',      de: 'Russischer Twist',          cat: 'reps_only', body: ['Obliques', 'Abs / Core'], desc_en: 'Seated rotation exercise targeting the obliques.', desc_de: 'Sitzende Drehübung für die seitlichen Bauchmuskeln.' },
  { en: 'Step-Up',            de: 'Step-Up',                   cat: 'reps_only', body: ['Quadriceps', 'Glutes'], desc_en: 'Unilateral exercise stepping onto a box targeting quads and glutes.', desc_de: 'Einseitige Übung: auf eine Box steigen.' },

  // ── Time / Hold Time ───────────────────────────────────────────────────────
  { en: 'Plank',     de: 'Plank',       cat: 'time_hold', body: ['Abs / Core', 'Shoulders'], desc_en: 'Static core exercise holding a forearm or push-up position.', desc_de: 'Statische Kernübung im Unterarm- oder Liegestützposition.' },
  { en: 'Side Plank', de: 'Seitstütz',  cat: 'time_hold', body: ['Obliques', 'Abs / Core'], desc_en: 'Lateral static core exercise on one forearm and foot.', desc_de: 'Seitliche statische Kernübung auf einem Unterarm.' },
  { en: 'Wall Sit',  de: 'Wandsitzen',  cat: 'time_hold', body: ['Quadriceps', 'Glutes'], desc_en: 'Static lower body exercise holding a seated position against a wall.', desc_de: 'Statische Unterkörperübung: sitzende Position an einer Wand.' },

  // ── Distance & Time ────────────────────────────────────────────────────────
  { en: 'Air Bike (Assault Bike)',     de: 'Air Bike (Assault Bike)', cat: 'distance_and_time', body: ['Cardio', 'Full Body'], desc_en: 'Full-body cardio on a fan resistance bike.', desc_de: 'Ganzkörper-Cardio auf dem Widerstandsluftfahrrad.' },
  { en: 'Cross Trainer',               de: 'Cross Trainer',           cat: 'distance_and_time', body: ['Cardio', 'Full Body'], desc_en: 'Low-impact cardio machine mimicking running and skiing.', desc_de: 'Gelenkschonendes Kardiogerät.' },
  { en: 'Rowing Machine',              de: 'Rudermaschine',           cat: 'distance_and_time', body: ['Cardio', 'Back', 'Full Body'], desc_en: 'Full-body cardio exercise on a rowing ergometer.', desc_de: 'Ganzkörper-Kardioübung am Ruderergometer.' },
  { en: 'Stairmaster',                 de: 'Stairmaster',             cat: 'distance_and_time', body: ['Cardio', 'Glutes', 'Calves'], desc_en: 'Stair-climbing cardio machine targeting legs and glutes.', desc_de: 'Treppensteiger-Kardiogerät für Beine und Gesäß.' },
  { en: 'Stationary Bike (Ergometer)', de: 'Fahrradergometer',        cat: 'distance_and_time', body: ['Cardio', 'Quadriceps'], desc_en: 'Cardio exercise on a stationary bike.', desc_de: 'Kardioübung auf dem Fahrradergometer.' },
  { en: 'Treadmill',                   de: 'Laufband',                cat: 'distance_and_time', body: ['Cardio'], desc_en: 'Running or walking cardio on a treadmill.', desc_de: 'Laufen oder Gehen auf dem Laufband.' },

  // ── Assisted Bodyweight ────────────────────────────────────────────────────
  { en: 'Assisted Dip',    de: 'Unterstützter Dip',     cat: 'assisted_bodyweight', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Dip with machine assistance reducing effective bodyweight.', desc_de: 'Dip mit Maschinenunterstützung zur Gewichtsreduzierung.' },
  { en: 'Assisted Pull-Up', de: 'Unterstützter Klimmzug', cat: 'assisted_bodyweight', body: ['Lats', 'Back', 'Biceps'], desc_en: 'Pull-up with machine assistance reducing effective bodyweight.', desc_de: 'Klimmzug mit Maschinenunterstützung.' },

  // ── Weighted Bodyweight ────────────────────────────────────────────────────
  { en: 'Weighted Dip',    de: 'Gewichteter Dip',      cat: 'weighted_bodyweight', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Dip with added weight via belt or vest.', desc_de: 'Dip mit Zusatzgewicht über Gürtel oder Weste.' },
  { en: 'Weighted Pull-Up', de: 'Gewichteter Klimmzug', cat: 'weighted_bodyweight', body: ['Lats', 'Back', 'Biceps'], desc_en: 'Pull-up with added weight via belt or vest.', desc_de: 'Klimmzug mit Zusatzgewicht.' },
  { en: 'Weighted Push-Up', de: 'Gewichteter Liegestütz', cat: 'weighted_bodyweight', body: ['Chest', 'Triceps', 'Shoulders'], desc_en: 'Push-up with added weight on the back.', desc_de: 'Liegestütz mit Zusatzgewicht auf dem Rücken.' },
  { en: 'Belt Squat',      de: 'Gürtel Kniebeuge',     cat: 'weighted_bodyweight', body: ['Quadriceps', 'Glutes', 'Hamstrings'], desc_en: 'Squat with weight hung from a hip belt, unloading the spine.', desc_de: 'Kniebeuge mit Gewicht an einem Hüftgürtel, entlastet die Wirbelsäule.' },
];

async function run() {
  const uri = process.env.MONGO_URI || 'mongodb://localhost:27017/lifther';
  await mongoose.connect(uri);
  const db = mongoose.connection.db;
  console.log('Connected to DB:', uri);

  /* ── 1. Seed categories & build lookup map ── */
  console.log('\nSeeding exercise categories...');
  const categoryMap: Record<string, mongoose.Types.ObjectId> = {};
  for (const cat of categoryDefs) {
    let doc = await db.collection('exercisecategories').findOne({ 'name.en': cat.name.en });
    if (!doc) {
      const result = await db.collection('exercisecategories').insertOne({
        ...cat,
        status: 1,
        deleted_at: null,
        createdAt: new Date(),
        updatedAt: new Date(),
      });
      doc = { _id: result.insertedId };
      console.log(`  ✅ Category inserted: ${cat.name.en}`);
    } else {
      console.log(`  ⏭️  Category exists:   ${cat.name.en}`);
    }
    categoryMap[cat.key] = doc._id;
  }

  /* ── 2. Seed body parts & build lookup map (keyed by english name) ── */
  console.log('\nSeeding body parts...');
  const bodyPartMap: Record<string, mongoose.Types.ObjectId> = {};
  for (const bp of bodyPartDefs) {
    let doc = await db.collection('bodyparts').findOne({ 'name.en': bp.name.en });
    if (!doc) {
      const result = await db.collection('bodyparts').insertOne({
        ...bp,
        status: 1,
        deleted_at: null,
        createdAt: new Date(),
        updatedAt: new Date(),
      });
      doc = { _id: result.insertedId };
      console.log(`  ✅ Body part inserted: ${bp.name.en}`);
    } else {
      console.log(`  ⏭️  Body part exists:   ${bp.name.en}`);
    }
    bodyPartMap[bp.name.en] = doc._id;
  }

  /* ── 3. Seed exercises with category + targeted body parts ── */
  console.log('\nSeeding exercises...');
  let inserted = 0;
  let updated = 0;

  for (const ex of exercises) {
    const targetedBodyParts = ex.body.map((name) => {
      const id = bodyPartMap[name];
      if (!id) console.warn(`  ⚠️  Unknown body part "${name}" for exercise "${ex.en}"`);
      return id;
    }).filter(Boolean);

    const exists = await db.collection('exercises').findOne({ 'name.en': ex.en, deleted_at: null });
    if (!exists) {
      await db.collection('exercises').insertOne({
        name:              { en: ex.en,      de: ex.de      },
        description:       { en: ex.desc_en, de: ex.desc_de },
        category:          categoryMap[ex.cat],
        targetedBodyParts,
        status:            1,
        deleted_at:        null,
        createdAt:         new Date(),
        updatedAt:         new Date(),
      });
      inserted++;
      console.log(`  ✅ ${ex.en}`);
    } else {
      // Backfill body parts on already-seeded exercises.
      await db.collection('exercises').updateOne(
        { _id: exists._id },
        { $set: { targetedBodyParts, updatedAt: new Date() } },
      );
      updated++;
    }
  }

  console.log(`\nDone! Exercises — inserted: ${inserted}, updated: ${updated}`);
  await mongoose.disconnect();
}

run().catch((err) => {
  console.error('Seeder error:', err);
  process.exit(1);
});
