// ExerciseService — rich exercise database with smart selection

// ─── Database ─────────────────────────────────────────────────────────────────

const EXERCISES_DB = [
  // ── EMPUJE HORIZONTAL ────────────────────────────────────────────────────────
  {
    id: 'press-banca-barra',
    name: 'Press banca con barra',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 3,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['press-banca-mancuernas', 'press-inclinado-barra'],
    objectives: ['hipertrofia', 'fuerza', 'recomp'],
    tags: ['pecho', 'clásico', 'barra'],
    cues: ['Escápulas retraídas y deprimidas', 'Pies firmes en el suelo', 'Baja controlado al esternón', 'Empuja oblicuo hacia arriba'],
  },
  {
    id: 'press-banca-mancuernas',
    name: 'Press banca con mancuernas',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['press-banca-barra', 'press-inclinado-mancuernas', 'press-pecho-mancuerna-unilateral'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'equilibrio', 'unilateral'],
    cues: ['Controla la fase excéntrica', 'Rango completo de movimiento', 'No bloquees codos en el top'],
  },
  {
    id: 'press-inclinado-barra',
    name: 'Press inclinado con barra',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Pectoral superior', 'Deltoides ant.'], secondary: ['Tríceps'] },
    muscleGroup: 'pecho',
    variants: ['press-inclinado-mancuernas', 'press-banca-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho-superior', 'barra'],
    cues: ['Inclinación 30-45°', 'Barra al tercio superior del pecho'],
  },
  {
    id: 'press-inclinado-mancuernas',
    name: 'Press inclinado con mancuernas',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral superior'], secondary: ['Tríceps', 'Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['press-inclinado-barra', 'press-banca-mancuernas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho-superior', 'principiante'],
    cues: ['Controla la apertura en el descenso'],
  },
  {
    id: 'fondos-paralelas',
    name: 'Fondos en paralelas',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Pectoral inferior', 'Tríceps'], secondary: ['Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['fondos-lastre', 'press-banca-barra'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['bodyweight', 'funcional', 'pecho-inferior'],
    cues: ['Inclínate hacia delante para enfatizar pecho', 'Baja hasta 90° en el codo'],
  },
  {
    id: 'aperturas-polea',
    name: 'Aperturas en polea cruzada',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: [] },
    muscleGroup: 'pecho',
    variants: ['press-banca-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'pecho', 'polea'],
    cues: ['Tensión constante en el pectoral', 'Ligera flexión del codo fija'],
  },

  // ── EMPUJE VERTICAL ───────────────────────────────────────────────────────────
  {
    id: 'press-militar-barra',
    name: 'Press militar con barra',
    pattern: 'empuje-vertical',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 4,
    muscles: { primary: ['Deltoides anterior', 'Deltoides medial'], secondary: ['Tríceps', 'Trapecio superior', 'Core'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas', 'press-arnold'],
    objectives: ['hipertrofia', 'fuerza', 'rendimiento'],
    tags: ['hombros', 'fuerza', 'barra'],
    cues: ['Activa el core durante todo el movimiento', 'Evita extensión lumbar excesiva', 'Barra sube vertical frente al rostro'],
  },
  {
    id: 'press-militar-mancuernas',
    name: 'Press con mancuernas sentado',
    pattern: 'empuje-vertical',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides anterior', 'Deltoides medial'], secondary: ['Tríceps'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-barra', 'press-arnold', 'press-hombro-maquina', 'press-hombro-mancuerna-unilateral'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['hombros', 'principiante'],
    cues: ['Codos ligeramente por delante del plano frontal'],
  },
  {
    id: 'press-hombro-maquina',
    name: 'Press de hombro en máquina',
    pattern: 'empuje-vertical',
    category: 'empuje',
    level: 'principiante',
    equipment: 'máquina',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Deltoides anterior', 'Deltoides medial'], secondary: ['Tríceps'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas', 'press-militar-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['hombros', 'máquina', 'guiado', 'principiante'],
    cues: ['Ajusta el asiento para que las asas queden a la altura de los hombros', 'Empuja sin bloquear los codos de golpe', 'Espalda apoyada en el respaldo'],
  },
  {
    id: 'press-arnold',
    name: 'Press Arnold',
    pattern: 'empuje-vertical',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Deltoides anterior', 'Deltoides medial'], secondary: ['Tríceps', 'Deltoides posterior'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['hombros', 'rotación', 'clásico'],
    cues: ['Pronación controlada al subir', 'Rango completo de rotación'],
  },
  {
    id: 'elevaciones-laterales',
    name: 'Elevaciones laterales',
    group: 'delt_lat',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides medial'], secondary: [] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales-cable', 'elevacion-lateral-mancuerna-unilateral'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['aislamiento', 'hombros', 'deltoides-medial'],
    cues: ['Ligera inclinación del torso', 'Pulgares ligeramente hacia abajo', 'No superes la altura del hombro'],
  },
  {
    id: 'extensiones-triceps-polea',
    name: 'Extensiones tríceps en polea',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['skull-crusher'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['aislamiento', 'tríceps', 'polea'],
    cues: ['Codos pegados al cuerpo y fijos', 'Extensión completa en el fondo'],
  },

  // ── TRACCIÓN HORIZONTAL ───────────────────────────────────────────────────────
  {
    id: 'remo-barra',
    name: 'Remo con barra pronado',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 4,
    muscles: { primary: ['Dorsal ancho', 'Romboides'], secondary: ['Bíceps', 'Trapecio medio', 'Deltoides post.'] },
    muscleGroup: 'espalda',
    variants: ['remo-mancuerna', 'remo-polea-baja'],
    objectives: ['hipertrofia', 'fuerza', 'rendimiento'],
    tags: ['espalda', 'fuerza', 'barra'],
    cues: ['Torso a 45-70°', 'Codos a los costados', 'Retracción escapular al final'],
  },
  {
    id: 'remo-mancuerna',
    unilateral: true,
    name: 'Remo a una mano con mancuerna',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Romboides'], secondary: ['Bíceps', 'Deltoides post.'] },
    muscleGroup: 'espalda',
    variants: ['remo-barra', 'remo-polea-baja'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['espalda', 'unilateral', 'principiante'],
    cues: ['Apoya la rodilla en el banco', 'Lleva el codo alto y atrás'],
  },
  {
    id: 'remo-polea-baja',
    name: 'Remo en polea baja',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Romboides'], secondary: ['Bíceps'] },
    muscleGroup: 'espalda',
    variants: ['remo-mancuerna', 'remo-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'polea', 'principiante'],
    cues: ['Torso erguido al final del recorrido', 'Retrae escápulas activamente'],
  },
  {
    id: 'face-pull',
    name: 'Face pull en polea alta',
    group: 'delt_post',
    pattern: 'aislamiento-hombro',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides posterior', 'Romboides'], secondary: ['Trapecio medio', 'Manguito rotador'] },
    muscleGroup: 'delt_post',
    variants: [],
    objectives: ['hipertrofia', 'recomp', 'rendimiento', 'fuerza'],
    tags: ['hombros-posterior', 'salud', 'prevención'],
    cues: ['Cuerda hasta la frente', 'Codos altos al final', 'Rotación externa en el tope'],
  },
  {
    id: 'remo-chest-supported',
    name: 'Remo con mancuernas en banco inclinado',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Romboides', 'Trapecio medio'], secondary: ['Dorsal ancho', 'Bíceps'] },
    muscleGroup: 'espalda',
    variants: ['remo-mancuerna', 'face-pull'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda-alta', 'chest-supported', 'seguro'],
    cues: ['Pecho apoyado elimina el trampeo', 'Retracción escapular completa'],
  },

  // ── TRACCIÓN VERTICAL ─────────────────────────────────────────────────────────
  {
    id: 'dominadas',
    name: 'Dominadas pronadas',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 4,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps', 'Romboides', 'Infraespinoso'] },
    muscleGroup: 'espalda',
    variants: ['dominadas-supinas', 'jalon-polea'],
    objectives: ['hipertrofia', 'fuerza', 'rendimiento'],
    tags: ['bodyweight', 'espalda', 'clásico'],
    cues: ['Deprime las escápulas antes de tirar', 'Codos hacia abajo y atrás', 'Rango completo arriba y abajo'],
  },
  {
    id: 'dominadas-supinas',
    name: 'Chin-ups (dominadas supinas)',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Dorsal ancho', 'Bíceps braquial'], secondary: ['Romboides'] },
    muscleGroup: 'espalda',
    variants: ['dominadas', 'jalon-polea'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['bodyweight', 'bíceps', 'espalda'],
    cues: ['Agarre supino activa más el bíceps', 'Codos cerca del torso'],
  },
  {
    id: 'jalon-polea',
    name: 'Jalón en polea con barra ancha',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps', 'Romboides'] },
    muscleGroup: 'espalda',
    variants: ['dominadas', 'jalon-neutro'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'polea', 'principiante'],
    cues: ['Inclínate ligeramente hacia atrás', 'Lleva la barra al esternón'],
  },
  {
    id: 'curl-biceps-barra',
    name: 'Curl bíceps con barra',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial', 'Braquiorradial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-mancuernas', 'curl-martillo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['aislamiento', 'bíceps'],
    cues: ['Codos fijos a los costados', 'Supinación completa en el tope'],
  },
  {
    id: 'curl-martillo',
    name: 'Curl martillo con mancuernas',
    group: 'antebrazo',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Braquial', 'Braquiorradial'], secondary: ['Bíceps braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra'],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'bíceps', 'antebrazo'],
    cues: ['Agarre neutro durante todo el recorrido'],
  },

  // ── SENTADILLA ────────────────────────────────────────────────────────────────
  {
    id: 'sentadilla-trasera',
    name: 'Sentadilla trasera con barra',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 5,
    technicalDifficulty: 4,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Erectores espinales', 'Core', 'Aductores'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-frontal', 'goblet-squat', 'hack-squat'],
    objectives: ['hipertrofia', 'fuerza', 'recomp', 'rendimiento'],
    tags: ['pierna', 'fuerza', 'clásico', 'barra'],
    cues: ['Rodillas alineadas con los pies', 'Pecho alto durante todo el recorrido', 'Profundidad mínima paralela', 'Empuja el suelo hacia abajo'],
  },
  {
    id: 'sentadilla-frontal',
    name: 'Sentadilla frontal con barra',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'avanzado',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 5,
    technicalDifficulty: 5,
    muscles: { primary: ['Cuádriceps'], secondary: ['Glúteos', 'Core', 'Erectores'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-trasera'],
    objectives: ['fuerza', 'rendimiento'],
    tags: ['pierna', 'técnico', 'cuádriceps', 'avanzado'],
    cues: ['Codos altos y delante', 'Movilidad de muñeca y tobillo crítica'],
  },
  {
    id: 'goblet-squat',
    name: 'Goblet squat con kettlebell',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'kettlebell',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Core', 'Isquios'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-trasera', 'sentadilla-bulgara'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'principiante', 'funcional'],
    cues: ['Peso frente al pecho como contrapeso', 'Codos empujan las rodillas hacia afuera'],
  },
  {
    id: 'sentadilla-bulgara',
    unilateral: true,
    name: 'Sentadilla búlgara (RFESS)',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 3,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-trasera', 'zancada-mancuernas'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['pierna', 'unilateral', 'glúteos'],
    cues: ['Pie trasero sobre banco a la altura de la cadera', 'Rodilla delantera no supera la punta del pie'],
  },
  {
    id: 'hack-squat',
    name: 'Hack squat en máquina',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps'], secondary: ['Glúteos'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-trasera', 'prensa-piernas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'cuádriceps', 'máquina'],
    cues: ['Pies medios-bajos en la plataforma para más cuádriceps', 'Profundidad completa'],
  },
  {
    id: 'prensa-piernas',
    name: 'Prensa de piernas 45°',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps'], secondary: ['Glúteos'] },
    muscleGroup: 'cuadriceps',
    variants: ['hack-squat', 'sentadilla-trasera'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'máquina', 'seguro'],
    cues: ['No bloquees completamente las rodillas', 'Pies altos para más glúteos, bajos para más cuádriceps'],
  },
  {
    id: 'extension-cuadriceps',
    name: 'Extensión de cuádriceps',
    pattern: 'extension-rodilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps'], secondary: [] },
    muscleGroup: 'cuadriceps',
    variants: [],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'cuádriceps', 'máquina'],
    cues: ['Extensión completa en el tope', 'Excéntrica lenta (3 seg)'],
  },

  // ── BISAGRA DE CADERA ─────────────────────────────────────────────────────────
  {
    id: 'peso-muerto',
    name: 'Peso muerto convencional',
    pattern: 'bisagra',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 5,
    technicalDifficulty: 5,
    muscles: { primary: ['Isquios', 'Glúteos', 'Erectores espinales'], secondary: ['Trapecio', 'Romboides', 'Cuádriceps', 'Core'] },
    muscleGroup: 'isquios',
    variants: ['peso-muerto-rumano', 'rdl-mancuernas'],
    objectives: ['fuerza', 'rendimiento', 'hipertrofia'],
    tags: ['compuesto', 'fuerza', 'posterior', 'clásico'],
    cues: ['Barra sobre el mediopié', 'Espalda neutra antes de tirar', 'Empuja el suelo, no tires de la barra', 'Bloqueo con cadera al frente'],
  },
  {
    id: 'peso-muerto-rumano',
    name: 'Peso muerto rumano (RDL) con barra',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 3,
    muscles: { primary: ['Isquios', 'Glúteos'], secondary: ['Erectores', 'Core'] },
    muscleGroup: 'isquios',
    variants: ['rdl-mancuernas', 'peso-muerto'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['isquios', 'glúteos', 'bisagra'],
    cues: ['Empuja las caderas hacia atrás', 'Rodillas ligeramente flexionadas y fijas', 'Barra pegada al cuerpo'],
  },
  {
    id: 'rdl-mancuernas',
    name: 'RDL con mancuernas',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Isquios', 'Glúteos'], secondary: ['Erectores'] },
    muscleGroup: 'isquios',
    variants: ['peso-muerto-rumano', 'rdl-unilateral-mancuerna'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['isquios', 'glúteos', 'principiante'],
    cues: ['Mancuernas a los costados de los muslos', 'Empuje de caderas atrás hasta sentir tensión en isquios'],
  },
  {
    id: 'hip-thrust-barra',
    name: 'Hip thrust con barra',
    group: 'gluteos',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['hip-thrust-mancuernas', 'puente-gluteo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'bisagra'],
    cues: ['Barbilla en el pecho', 'Extensión completa de cadera en el tope', 'Pies alineados debajo de las rodillas'],
  },
  {
    id: 'curl-femoral-tumbado',
    name: 'Curl femoral tumbado',
    pattern: 'flexion-rodilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Isquios'], secondary: [] },
    muscleGroup: 'isquios',
    variants: ['curl-nordico'],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'isquios', 'máquina'],
    cues: ['Flexión completa (talón al glúteo)', 'Excéntrica controlada'],
  },
  {
    id: 'good-morning',
    name: 'Good morning',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'avanzado',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 5,
    muscles: { primary: ['Isquios', 'Erectores espinales'], secondary: ['Glúteos', 'Core'] },
    muscleGroup: 'isquios',
    variants: ['peso-muerto-rumano'],
    objectives: ['fuerza', 'rendimiento'],
    tags: ['posterior', 'técnico', 'avanzado'],
    cues: ['Cargas muy ligeras al aprender', 'Espalda neutra en todo momento'],
  },

  // ── CORE ──────────────────────────────────────────────────────────────────────
  {
    id: 'plancha-frontal',
    name: 'Plancha frontal',
    unit: 'time',
    timeTarget: '30-60s',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Transverso abdominal', 'Core'], secondary: [] },
    muscleGroup: 'core',
    variants: ['plancha-rll', 'rueda-abdominal'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento', 'fuerza'],
    tags: ['core', 'estabilización', 'principiante'],
    cues: ['Cuerpo en línea recta de cabeza a talones', 'Activa glúteos y aprieta el core', 'No aguantes el aliento'],
  },
  {
    id: 'rueda-abdominal',
    name: 'Rueda abdominal (ab-wheel rollout)',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'avanzado',
    equipment: 'rueda',
    compound: false,
    fatigueLoad: 3,
    technicalDifficulty: 4,
    muscles: { primary: ['Core', 'Dorsal ancho'], secondary: ['Tríceps', 'Deltoides anterior'] },
    muscleGroup: 'core',
    variants: ['plancha-frontal'],
    objectives: ['rendimiento', 'fuerza'],
    tags: ['core', 'antiextensión', 'avanzado'],
    cues: ['Comienza con el recorrido corto y amplía progresivamente', 'Columna neutra durante la extensión'],
  },
  {
    id: 'pallof-press',
    name: 'Pallof press en polea',
    pattern: 'core-antirrotacion',
    category: 'core',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Oblicuos', 'Transverso abdominal'], secondary: ['Core'] },
    muscleGroup: 'core',
    variants: [],
    objectives: ['rendimiento', 'fuerza', 'hipertrofia'],
    tags: ['core', 'antirrotación', 'funcional'],
    cues: ['Pies a la anchura de los hombros perpendiculares a la polea', 'Resiste la rotación del torso al extender'],
  },
  {
    id: 'crunch-cable',
    name: 'Crunch en polea alta',
    pattern: 'core-flexion',
    category: 'core',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Recto abdominal'], secondary: ['Oblicuos'] },
    muscleGroup: 'core',
    variants: [],
    objectives: ['hipertrofia'],
    tags: ['core', 'abdomen', 'aislamiento'],
    cues: ['Rodillas en el suelo', 'Contrae enrollando la columna, no empujando la cabeza'],
  },
  {
    id: 'elevacion-piernas-colgado',
    name: 'Elevación de piernas colgado',
    pattern: 'core-flexion',
    category: 'core',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Recto abdominal inferior', 'Flexores de cadera'], secondary: ['Oblicuos'] },
    muscleGroup: 'core',
    variants: ['crunch-cable'],
    objectives: ['rendimiento', 'hipertrofia'],
    tags: ['core', 'abdomen', 'funcional'],
    cues: ['Controla el descenso lento', 'Evita el balanceo del cuerpo'],
  },

  // ── PANTORRILLA ───────────────────────────────────────────────────────────────
  {
    id: 'elevacion-talones',
    name: 'Elevación de talones de pie',
    group: 'gemelos',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Gemelos', 'Sóleo'], secondary: [] },
    muscleGroup: 'gemelos',
    variants: [],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['gemelos', 'aislamiento', 'pantorrilla'],
    cues: ['Rango completo arriba y abajo', 'Pausa de 1 seg en el tope'],
  },

  // ── PECHO ADICIONAL ───────────────────────────────────────────────────────────
  {
    id: 'push-up',
    name: 'Flexión de pecho (push-up)',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['press-banca-mancuernas'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['pecho', 'bodyweight', 'principiante', 'funcional'],
    cues: ['Cuerpo en línea recta de cabeza a talones', 'Codos a 45° del cuerpo', 'Rango completo de movimiento'],
  },
  {
    id: 'cable-fly',
    name: 'Aperturas en polea (cable fly)',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: [] },
    muscleGroup: 'pecho',
    variants: ['aperturas-polea', 'press-banca-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['pecho', 'aislamiento', 'polea', 'tensión-constante'],
    cues: ['Tensión constante en todo el recorrido', 'Ligera flexión del codo fija', 'Une las manos delante del pecho'],
  },
  {
    id: 'press-declinado-mancuernas',
    name: 'Press declinado con mancuernas',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Pectoral inferior'], secondary: ['Tríceps', 'Deltoides ant.'] },
    muscleGroup: 'pecho',
    variants: ['fondos-paralelas', 'press-banca-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['pecho-inferior', 'declinado'],
    cues: ['Banco a -30°', 'Pies bien asegurados', 'Controla la apertura en el descenso'],
  },

  // ── ESPALDA ADICIONAL ─────────────────────────────────────────────────────────
  {
    id: 'remo-t-barra',
    name: 'Remo en T-barra',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 3,
    muscles: { primary: ['Dorsal ancho', 'Romboides', 'Trapecio medio'], secondary: ['Bíceps', 'Deltoides post.'] },
    muscleGroup: 'espalda',
    variants: ['remo-barra', 'remo-mancuerna'],
    objectives: ['hipertrofia', 'fuerza'],
    tags: ['espalda', 'masa', 'barra'],
    cues: ['Torso a 45°', 'Agarre neutro o pronado', 'Jala hasta el abdomen'],
  },
  {
    id: 'remo-invertido',
    name: 'Remo invertido (bodyweight row)',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Romboides', 'Trapecio medio'], secondary: ['Bíceps', 'Dorsal ancho'] },
    muscleGroup: 'espalda',
    variants: ['remo-mancuerna', 'remo-chest-supported'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['espalda', 'bodyweight', 'principiante', 'accesible'],
    cues: ['Cuerpo en plancha durante todo el movimiento', 'Retracción escapular completa en el tope'],
  },
  {
    id: 'straight-arm-pulldown',
    name: 'Straight-arm pulldown en polea',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Serrato', 'Trapecio inferior'] },
    muscleGroup: 'espalda',
    variants: ['jalon-polea'],
    objectives: ['hipertrofia'],
    tags: ['espalda', 'aislamiento', 'dorsal', 'polea'],
    cues: ['Brazos rectos con ligera flexión de codo', 'Tira hacia abajo con los codos', 'Lleva las manos al nivel de las caderas'],
  },
  {
    id: 'encogimientos-trapecio',
    name: 'Encogimientos con barra (shrugs)',
    group: 'trapecio',
    pattern: 'encogimiento',
    category: 'traccion',
    level: 'principiante',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Trapecio superior'], secondary: ['Elevador de la escápula'] },
    muscleGroup: 'trapecio',
    variants: [],
    objectives: ['hipertrofia'],
    tags: ['trapecios', 'aislamiento', 'hombros'],
    cues: ['Encogimiento puro, sin rotar hombros', 'Pausa de 1 seg en el tope', 'Agarre cómodo y hombros relajados abajo'],
  },

  // ── PIERNA ADICIONAL ──────────────────────────────────────────────────────────
  {
    id: 'zancada-mancuernas',
    unilateral: true,
    name: 'Zancada con mancuernas',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-bulgara', 'step-up-banco'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['pierna', 'unilateral', 'glúteos', 'funcional'],
    cues: ['Da un paso largo', 'Rodilla trasera casi toca el suelo', 'Torso erguido y core activo'],
  },
  {
    id: 'step-up-banco',
    unilateral: true,
    name: 'Step-up en banco',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteos', 'Cuádriceps'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['zancada-mancuernas', 'sentadilla-bulgara'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['pierna', 'unilateral', 'glúteos', 'funcional'],
    cues: ['Todo el pie sobre el banco', 'Empuja desde el talón', 'Controla el descenso'],
  },
  {
    id: 'sentadilla-sumo',
    name: 'Sentadilla sumo',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps', 'Glúteos', 'Aductores'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'cuadriceps',
    variants: ['goblet-squat', 'sentadilla-trasera'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'glúteos', 'aductores'],
    cues: ['Pies a más de la anchura de hombros, puntas afuera 45°', 'Rodillas rastreando hacia las puntas', 'Pecho alto'],
  },
  {
    id: 'curl-nordico',
    name: 'Curl nórdico',
    pattern: 'flexion-rodilla',
    category: 'pierna',
    level: 'avanzado',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 3,
    technicalDifficulty: 4,
    muscles: { primary: ['Isquios'], secondary: ['Glúteos', 'Core'] },
    muscleGroup: 'isquios',
    variants: ['curl-femoral-tumbado'],
    objectives: ['rendimiento', 'fuerza'],
    tags: ['isquios', 'bodyweight', 'avanzado', 'prevención'],
    cues: ['Desciende lo más lento posible', 'Usa las manos para amortiguar en el fondo', 'Excelente para prevenir lesiones'],
  },
  {
    id: 'puente-gluteo',
    name: 'Puente de glúteos con mancuerna',
    pattern: 'extension-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'principiante', 'accesible'],
    cues: ['Pies a la anchura de caderas', 'Aprieta glúteos en el tope', 'Barbilla en el pecho'],
  },
  {
    id: 'abduccion-cadera',
    name: 'Abducción de cadera en máquina',
    pattern: 'abduccion-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteo medio', 'Glúteo menor', 'Tensor fascia lata'], secondary: [] },
    muscleGroup: 'abductores',
    variants: [],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'aislamiento', 'cadera'],
    cues: ['Movimiento controlado', 'No uses impulso', 'Pausa al máximo de apertura'],
  },

  // ── HOMBRO ADICIONAL ──────────────────────────────────────────────────────────
  {
    id: 'elevacion-frontal',
    name: 'Elevación frontal con mancuernas',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Deltoides anterior'], secondary: [] },
    muscleGroup: 'delt_ant',
    variants: ['elevaciones-laterales', 'press-militar-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'hombros', 'deltoides-anterior'],
    cues: ['Levanta hasta la horizontal', 'Ligero codo doblado', 'Evita el trampeo con el tronco'],
  },
  {
    id: 'remo-al-menton',
    name: 'Remo al mentón con barra',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Deltoides medial', 'Trapecio superior'], secondary: ['Bíceps', 'Deltoides anterior'] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales', 'press-militar-barra'],
    objectives: ['hipertrofia'],
    tags: ['hombros', 'trapecios', 'barra'],
    cues: ['Agarre estrecho', 'Codos altos y delante', 'Barra cerca del cuerpo al subir'],
  },

  // ── BÍCEPS ADICIONAL ──────────────────────────────────────────────────────────
  {
    id: 'curl-predicador',
    name: 'Curl en banco predicador',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-cable'],
    objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'predicador'],
    cues: ['El banco elimina el trampeo', 'Extensión completa en el fondo', 'Aprieta en el tope'],
  },
  {
    id: 'curl-concentrado',
    unilateral: true,
    name: 'Curl concentrado con mancuerna',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: [] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-alterno-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'unilateral'],
    cues: ['Codo apoyado en el muslo interno', 'Supinación completa al subir', 'Pausa en la contracción'],
  },
  {
    id: 'curl-cable',
    name: 'Curl en polea baja',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-predicador'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['bíceps', 'aislamiento', 'polea', 'tensión-constante'],
    cues: ['Tensión desde el inicio', 'Codos fijos a los costados', 'Contracción máxima en el tope'],
  },

  // ── TRÍCEPS ADICIONAL ─────────────────────────────────────────────────────────
  {
    id: 'skull-crusher',
    name: 'Skull crusher con barra EZ',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'overhead-tricep-extension'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'barra'],
    cues: ['Baja la barra hacia la frente o detrás de la cabeza', 'Codos apuntando al techo fijos', 'Extensión completa'],
  },
  {
    id: 'press-agarre-cerrado',
    name: 'Press agarre cerrado (close-grip bench)',
    group: 'triceps',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Tríceps braquial'], secondary: ['Pectoral mayor', 'Deltoides ant.'] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'skull-crusher'],
    objectives: ['hipertrofia', 'fuerza'],
    tags: ['tríceps', 'compuesto', 'barra'],
    cues: ['Agarre a la anchura de hombros', 'Codos juntos al cuerpo en el descenso', 'Énfasis en la extensión de codo'],
  },
  {
    id: 'fondos-banco',
    name: 'Fondos en banco (tricep dips)',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tríceps braquial'], secondary: ['Deltoides ant.'] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'fondos-paralelas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['tríceps', 'bodyweight', 'principiante'],
    cues: ['Manos en el banco detrás de ti', 'Baja flexionando codos a 90°', 'Piernas estiradas para más intensidad'],
  },
  {
    id: 'overhead-tricep-extension',
    name: 'Extensión de tríceps sobre la cabeza',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial (cabeza larga)'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'skull-crusher', 'extension-triceps-mancuerna-unilateral'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'cabeza-larga'],
    cues: ['Codos cerca de la cabeza y apuntando al techo', 'Estiramiento completo de la cabeza larga', 'Extensión lenta y controlada'],
  },

  // ── CORE ADICIONAL ────────────────────────────────────────────────────────────
  {
    id: 'russian-twist',
    name: 'Russian twist con disco',
    pattern: 'core-antirrotacion',
    category: 'core',
    level: 'principiante',
    equipment: 'disco',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Oblicuos'], secondary: ['Recto abdominal', 'Flexores de cadera'] },
    muscleGroup: 'core',
    variants: ['pallof-press'],
    objectives: ['hipertrofia', 'rendimiento', 'recomp'],
    tags: ['core', 'oblicuos', 'rotación'],
    cues: ['Pies levantados del suelo (versión avanzada)', 'Rota desde el torso, no los brazos', 'Mantén la columna neutra'],
  },
  {
    id: 'dead-bug',
    name: 'Dead bug',
    unit: 'time',
    timeTarget: '30-45s',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Transverso abdominal', 'Core'], secondary: ['Flexores de cadera'] },
    muscleGroup: 'core',
    variants: ['plancha-frontal'],
    objectives: ['rendimiento', 'recomp', 'fuerza'],
    tags: ['core', 'antiextensión', 'control-motor'],
    cues: ['Mantén la zona lumbar pegada al suelo', 'Movimiento lento y coordinado', 'Exhala al extender extremidades'],
  },
  {
    id: 'hollow-body-hold',
    name: 'Hollow body hold',
    unit: 'time',
    timeTarget: '20-45s',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Recto abdominal', 'Transverso abdominal'], secondary: ['Flexores de cadera', 'Cuádriceps'] },
    muscleGroup: 'core',
    variants: ['plancha-frontal', 'dead-bug'],
    objectives: ['rendimiento', 'fuerza'],
    tags: ['core', 'antiextensión', 'gimnasia', 'funcional'],
    cues: ['Zona lumbar pegada al suelo en todo momento', 'Brazos y piernas juntos y extendidos', 'Aguanta el mayor tiempo posible'],
  },

  // ── GEMELOS ───────────────────────────────────────────────────────────────────
  {
    id: 'elevacion-talones-sentado',
    name: 'Elevación de talones sentado',
    group: 'gemelos',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Sóleo'], secondary: ['Gemelos'] },
    muscleGroup: 'gemelos',
    variants: ['elevacion-talones', 'elevacion-talones-prensa'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['gemelos', 'sóleo', 'aislamiento', 'pantorrilla'],
    cues: ['Rodillas a 90° bajo el acolchado', 'Rango completo arriba y abajo', 'El sóleo trabaja mejor con rodilla flexionada'],
  },
  {
    id: 'elevacion-talones-prensa',
    name: 'Elevación de talones en prensa',
    group: 'gemelos',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Gemelos'], secondary: ['Sóleo'] },
    muscleGroup: 'gemelos',
    variants: ['elevacion-talones', 'elevacion-talones-sentado'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['gemelos', 'prensa', 'aislamiento'],
    cues: ['Solo los dedos del pie en la plataforma', 'Controla el descenso completamente', 'Pausa en estiramiento máximo'],
  },
  {
    id: 'elevacion-talones-bodyweight',
    name: 'Elevación de talones con peso corporal',
    group: 'gemelos',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Gemelos'], secondary: ['Sóleo'] },
    muscleGroup: 'gemelos',
    variants: ['elevacion-talones', 'elevacion-talones-sentado'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['gemelos', 'bodyweight', 'accesible'],
    cues: ['Punta del pie en el borde de un escalón', 'Rango completo de movimiento', 'Series largas: 15-25 repeticiones'],
  },

  // ── ANTEBRAZO ─────────────────────────────────────────────────────────────────
  {
    id: 'curl-inverso-barra',
    name: 'Curl inverso con barra',
    group: 'antebrazo',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Braquiorradial', 'Extensores del carpo'], secondary: ['Bíceps braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-martillo', 'wrist-extension-barra'],
    objectives: ['hipertrofia'],
    tags: ['antebrazo', 'aislamiento', 'agarre'],
    cues: ['Agarre prono (palmas abajo)', 'Codos fijos a los costados', 'Rango completo de movimiento'],
  },
  {
    id: 'wrist-curl-mancuernas',
    name: 'Curl de muñeca con mancuernas',
    group: 'antebrazo',
    pattern: 'aislamiento-antebrazo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Flexores del carpo'], secondary: ['Braquiorradial'] },
    muscleGroup: 'antebrazo',
    variants: ['wrist-extension-barra', 'curl-inverso-barra'],
    objectives: ['hipertrofia'],
    tags: ['antebrazo', 'aislamiento', 'muñeca', 'flexores'],
    cues: ['Antebrazo apoyado sobre el muslo', 'Solo la muñeca se mueve', 'Rango completo de flexión'],
  },
  {
    id: 'wrist-extension-barra',
    name: 'Extensión de muñeca con barra',
    group: 'antebrazo',
    pattern: 'aislamiento-antebrazo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'barra',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Extensores del carpo'], secondary: [] },
    muscleGroup: 'antebrazo',
    variants: ['wrist-curl-mancuernas', 'curl-inverso-barra'],
    objectives: ['hipertrofia'],
    tags: ['antebrazo', 'aislamiento', 'muñeca', 'extensores'],
    cues: ['Palmas hacia abajo', 'Solo la muñeca se mueve', 'Usa poco peso con mucho rango'],
  },
  {
    id: 'farmer-walk',
    unit: 'time',
    timeTarget: '30-45s',
    name: "Farmer's carry (caminata con carga)",
    group: 'antebrazo',
    pattern: 'traccion-vertical',
    category: 'funcional',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 1,
    muscles: { primary: ['Flexores del carpo', 'Braquiorradial'], secondary: ['Trapecio', 'Core', 'Cuádriceps'] },
    muscleGroup: 'antebrazo',
    variants: ['wrist-curl-mancuernas'],
    objectives: ['hipertrofia', 'fuerza', 'rendimiento'],
    tags: ['antebrazo', 'agarre', 'funcional', 'fuerza'],
    cues: ['Hombros atrás y abajo', 'Camina erguido mirando al frente', 'Agarre firme pero sin crispación excesiva'],
  },

  // ── DELTOIDE POSTERIOR ────────────────────────────────────────────────────────
  {
    id: 'apertura-inversa-mancuernas',
    name: 'Apertura inversa con mancuernas (rear delt fly)',
    group: 'delt_post',
    pattern: 'aislamiento-hombro',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides posterior'], secondary: ['Romboides', 'Trapecio medio'] },
    muscleGroup: 'delt_post',
    variants: ['face-pull', 'reverse-pec-deck'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['hombros-posterior', 'deltoide', 'aislamiento'],
    cues: ['Torso paralelo al suelo o en banco inclinado', 'Codos ligeramente flexionados fijos', 'El movimiento parte del hombro, no del codo'],
  },
  {
    id: 'reverse-pec-deck',
    name: 'Reverse pec deck (máquina deltoides posterior)',
    group: 'delt_post',
    pattern: 'aislamiento-hombro',
    category: 'traccion',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Deltoides posterior'], secondary: ['Romboides'] },
    muscleGroup: 'delt_post',
    variants: ['apertura-inversa-mancuernas', 'face-pull'],
    objectives: ['hipertrofia'],
    tags: ['hombros-posterior', 'deltoide', 'máquina', 'aislamiento'],
    cues: ['Agarre neutral, pulgar arriba', 'Lleva los brazos hasta la línea del torso', 'Pausa apretando escápulas'],
  },

  // ── DELTOIDE LATERAL ──────────────────────────────────────────────────────────
  {
    id: 'elevaciones-laterales-cable',
    name: 'Elevaciones laterales en cable',
    group: 'delt_lat',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides medial'], secondary: [] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales', 'elevaciones-laterales-maquina'],
    objectives: ['hipertrofia'],
    tags: ['hombros', 'deltoide-lateral', 'tensión-constante'],
    cues: ['Tensión desde el inicio gracias al cable', 'El codo lidera el movimiento', 'No subes más de 90°'],
  },
  {
    id: 'elevaciones-laterales-maquina',
    name: 'Elevaciones laterales en máquina',
    group: 'delt_lat',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Deltoides medial'], secondary: [] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales', 'elevaciones-laterales-cable'],
    objectives: ['hipertrofia'],
    tags: ['hombros', 'deltoide-lateral', 'máquina', 'principiante'],
    cues: ['Ajusta el pivote a la altura del hombro', 'Movimiento suave y controlado', 'Sin trampas con el torso'],
  },

  // ── TIBIAL ANTERIOR ───────────────────────────────────────────────────────────
  {
    id: 'tibialis-raise-pared',
    name: 'Tibialis raise (elevación de puntera)',
    group: 'tibial',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tibial anterior'], secondary: ['Extensores de los dedos'] },
    muscleGroup: 'tibial',
    variants: ['tibialis-raise-banda'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['tibial', 'pantorrilla', 'prevención-shin-splints', 'bodyweight'],
    cues: ['Espalda apoyada en la pared', 'Levanta la punta del pie hacia la espinilla', 'Pausa en la contracción máxima'],
  },
  {
    id: 'tibialis-raise-banda',
    name: 'Tibialis raise con banda elástica',
    group: 'tibial',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tibial anterior'], secondary: [] },
    muscleGroup: 'tibial',
    variants: ['tibialis-raise-pared'],
    objectives: ['hipertrofia'],
    tags: ['tibial', 'banda', 'aislamiento'],
    cues: ['Banda fijada al suelo enfrente', 'Dorsiflexión completa contra la resistencia', 'Series altas: 15-30 reps'],
  },

  // ── ADUCTORES ─────────────────────────────────────────────────────────────────
  {
    id: 'maquina-aductores',
    name: 'Máquina de aductores',
    group: 'aductores',
    pattern: 'aduccion-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Aductor mayor', 'Aductor largo'], secondary: ['Gracilis'] },
    muscleGroup: 'aductores',
    variants: ['sentadilla-sumo', 'copenhagen-plank'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['aductores', 'muslo-interno', 'aislamiento', 'máquina'],
    cues: ['Rango completo de apertura', 'Cierre lento y controlado', 'Sin rebote en el punto máximo'],
  },
  {
    id: 'copenhagen-plank',
    name: 'Copenhagen plank (plancha lateral aductores)',
    unit: 'time',
    timeTarget: '15-30s',
    group: 'aductores',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'avanzado',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 4,
    muscles: { primary: ['Aductor mayor', 'Aductor largo'], secondary: ['Core lateral', 'Glúteo medio'] },
    muscleGroup: 'aductores',
    variants: ['maquina-aductores', 'plancha-lateral'],
    objectives: ['hipertrofia', 'rendimiento', 'fuerza'],
    tags: ['aductores', 'core', 'prevención-lesiones', 'avanzado'],
    cues: ['Pierna superior apoyada en banco o caja', 'Caderas en línea recta', 'Progresión: pie en banco → rodilla en banco'],
  },

  // ── PECHO ADICIONAL 3 ────────────────────────────────────────────────────────
  {
    id: 'pec-deck',
    name: 'Peck deck (contractora de pecho)',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Deltoides anterior'] },
    muscleGroup: 'pecho',
    variants: ['aperturas-polea', 'cable-fly'],
    objectives: ['hipertrofia'],
    tags: ['pecho', 'aislamiento', 'máquina', 'contracción'],
    cues: ['Mantén la contracción 1 seg en el punto de cierre', 'No abras más allá de donde sientas tensión en el hombro'],
  },
  {
    id: 'cruce-poleas-bajo',
    name: 'Cruce de poleas desde abajo (low-to-high)',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral superior', 'Deltoides anterior'], secondary: ['Pectoral mayor'] },
    muscleGroup: 'pecho',
    variants: ['cable-fly', 'press-inclinado-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['pecho-superior', 'aislamiento', 'polea', 'tensión-constante'],
    cues: ['Poleas a nivel de tobillo o suelo', 'Lleva las manos hacia arriba y adelante cruzándolas a la altura del pecho'],
  },
  {
    id: 'aperturas-mancuernas',
    name: 'Aperturas con mancuernas en banco plano',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Deltoides anterior'] },
    muscleGroup: 'pecho',
    variants: ['cable-fly', 'pec-deck'],
    objectives: ['hipertrofia'],
    tags: ['pecho', 'aislamiento', 'estiramiento'],
    cues: ['Ligera flexión de codo fija durante todo el movimiento', 'Abre hasta sentir el estiramiento pectoral, no más allá'],
  },
  {
    id: 'fondos-lastre',
    name: 'Fondos en paralelas con lastre',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'avanzado',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 4,
    technicalDifficulty: 4,
    muscles: { primary: ['Pectoral inferior', 'Tríceps'], secondary: ['Deltoides anterior'] },
    muscleGroup: 'pecho',
    variants: ['fondos-paralelas', 'press-agarre-cerrado'],
    objectives: ['hipertrofia', 'fuerza'],
    tags: ['pecho-inferior', 'tríceps', 'avanzado', 'lastre'],
    cues: ['Cinturón de lastre bien ajustado antes de subir', 'Inclínate hacia adelante para mayor activación pectoral'],
  },
  {
    id: 'press-pecho-maquina',
    name: 'Press de pecho en máquina',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'máquina',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides anterior'] },
    muscleGroup: 'pecho',
    variants: ['press-banca-mancuernas', 'pec-deck'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'máquina', 'principiante', 'seguro'],
    cues: ['Ajusta el asiento para que los mangos queden a la altura del pecho', 'Retrae las escápulas antes de empujar'],
  },
  {
    id: 'push-up-diamante',
    name: 'Flexión diamante (diamond push-up)',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial'], secondary: ['Pectoral mayor', 'Deltoides anterior'] },
    muscleGroup: 'triceps',
    variants: ['fondos-banco', 'extensiones-triceps-polea'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['tríceps', 'bodyweight', 'pecho', 'funcional'],
    cues: ['Manos juntas formando un diamante bajo el esternón', 'Codos se cierran hacia el cuerpo al descender'],
  },
  {
    id: 'press-pecho-banda',
    name: 'Press de pecho con banda elástica',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides anterior'] },
    muscleGroup: 'pecho',
    variants: ['push-up', 'press-banca-mancuernas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'banda', 'accesible', 'doméstico'],
    cues: ['Banda detrás de la espalda, extremos en las manos', 'Empuja extendiendo los codos desde el pecho hacia adelante'],
  },

  // ── DELTOIDES ADICIONAL ───────────────────────────────────────────────────────
  {
    id: 'elevacion-lateral-polea-unilateral',
    unilateral: true,
    name: 'Elevación lateral unilateral en cable',
    group: 'delt_lat',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides medial'], secondary: [] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales', 'elevaciones-laterales-cable'],
    objectives: ['hipertrofia'],
    tags: ['hombros', 'deltoide-lateral', 'unilateral', 'tensión-constante'],
    cues: ['Cable cruza por delante del cuerpo desde el lado contrario', 'Tensión constante desde el inicio del recorrido'],
  },
  {
    id: 'pajaros-mancuernas',
    name: 'Pájaros con mancuernas (bent-over fly)',
    group: 'delt_post',
    pattern: 'aislamiento-hombro',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides posterior'], secondary: ['Romboides', 'Trapecio medio'] },
    muscleGroup: 'delt_post',
    variants: ['apertura-inversa-mancuernas', 'face-pull'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['hombros-posterior', 'deltoide', 'aislamiento', 'mancuernas'],
    cues: ['Torso paralelo al suelo, rodillas ligeramente flexionadas', 'Los codos apuntan al techo, no hacia atrás'],
  },
  {
    id: 'deltoides-posterior-polea-unilateral',
    unilateral: true,
    name: 'Deltoides posterior en polea unilateral',
    group: 'delt_post',
    pattern: 'aislamiento-hombro',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides posterior'], secondary: ['Romboides'] },
    muscleGroup: 'delt_post',
    variants: ['apertura-inversa-mancuernas', 'face-pull'],
    objectives: ['hipertrofia'],
    tags: ['hombros-posterior', 'unilateral', 'polea', 'aislamiento'],
    cues: ['Cable a la altura del hombro o superior', 'Abre el brazo hacia atrás con el codo ligeramente doblado y fijo'],
  },
  {
    id: 'press-hombro-banda',
    name: 'Press de hombro con banda elástica',
    pattern: 'empuje-vertical',
    category: 'empuje',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Deltoides anterior', 'Deltoides medial'], secondary: ['Tríceps'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas', 'elevaciones-laterales'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['hombros', 'banda', 'accesible', 'doméstico'],
    cues: ['Pisa la banda con los pies, lleva los extremos a los hombros', 'Empuja hacia arriba manteniendo el core activo'],
  },

  // ── TRÍCEPS ADICIONAL ─────────────────────────────────────────────────────────
  {
    id: 'extension-triceps-tras-nuca-mancuerna',
    name: 'Extensión de tríceps tras nuca con mancuerna',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial (cabeza larga)'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extension-triceps-tras-nuca-cuerda', 'overhead-tricep-extension'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'cabeza-larga', 'aislamiento', 'overhead'],
    cues: ['Codos apuntan al techo durante todo el movimiento', 'Baja la mancuerna detrás de la cabeza hasta el estiramiento máximo'],
  },
  {
    id: 'extension-triceps-tras-nuca-cuerda',
    name: 'Extensión de tríceps tras nuca con cuerda en polea',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial (cabeza larga)'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extension-triceps-tras-nuca-mancuerna', 'overhead-tricep-extension'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'cabeza-larga', 'polea', 'overhead'],
    cues: ['Polea baja, de espaldas a la máquina, cuerda sobre la cabeza', 'Abre los extremos de la cuerda en el tope para mayor contracción'],
  },
  {
    id: 'extension-triceps-unilateral-polea',
    unilateral: true,
    name: 'Extensión de tríceps unilateral en polea',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'extension-triceps-triangulo'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'unilateral', 'aislamiento', 'polea'],
    cues: ['Un solo brazo, codo pegado al cuerpo y fijo', 'Extensión completa y pausa de 1 seg en el fondo'],
  },
  {
    id: 'extension-triceps-triangulo',
    name: 'Extensión de tríceps con agarre triangular',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'extension-triceps-unilateral-polea'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'polea', 'agarre-neutro'],
    cues: ['Agarre neutro activa las tres cabezas por igual', 'Codos pegados al cuerpo, extensión completa hacia abajo'],
  },
  {
    id: 'kickback-triceps',
    unilateral: true,
    name: 'Kickback de tríceps con mancuerna',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'fondos-banco'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'unilateral'],
    cues: ['Brazo superior paralelo al suelo y completamente fijo', 'Extiende el codo hacia atrás hasta la extensión completa, pausa'],
  },
  {
    id: 'extension-triceps-banda',
    name: 'Extensión de tríceps con banda elástica',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'fondos-banco'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['tríceps', 'banda', 'accesible', 'doméstico'],
    cues: ['Banda fijada en un punto por encima de la cabeza', 'Codos apuntando al techo, extensión completa hacia abajo'],
  },

  // ── ESPALDA ADICIONAL 2 ───────────────────────────────────────────────────────
  {
    id: 'jalon-neutro',
    name: 'Jalón en polea agarre neutro',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Bíceps braquial'], secondary: ['Romboides', 'Pectoral menor'] },
    muscleGroup: 'espalda',
    variants: ['jalon-polea', 'dominadas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'polea', 'agarre-neutro', 'principiante'],
    cues: ['Agarre neutro reduce el estrés en la muñeca', 'Lleva los codos hacia abajo y atrás apretando los dorsales'],
  },
  {
    id: 'remo-maquina',
    name: 'Remo en máquina (chest supported)',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'máquina',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Dorsal ancho', 'Romboides'], secondary: ['Bíceps', 'Trapecio medio'] },
    muscleGroup: 'espalda',
    variants: ['remo-polea-baja', 'remo-chest-supported'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'máquina', 'principiante', 'seguro'],
    cues: ['Pecho apoyado elimina el trampeo lumbar', 'Retrae las escápulas activamente al final del recorrido'],
  },
  {
    id: 'pullover-mancuerna',
    name: 'Pullover con mancuerna',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Pectoral mayor'], secondary: ['Tríceps', 'Serrato anterior'] },
    muscleGroup: 'espalda',
    variants: ['straight-arm-pulldown', 'jalon-polea'],
    objectives: ['hipertrofia'],
    tags: ['espalda', 'pecho', 'estiramiento', 'clásico'],
    cues: ['Tumbado transversalmente en el banco, solo omóplatos apoyados', 'Baja con brazos extendidos hasta sentir el estiramiento dorsal profundo'],
  },
  {
    id: 'dominadas-lastre',
    name: 'Dominadas con lastre',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'avanzado',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 5,
    technicalDifficulty: 4,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps', 'Romboides'] },
    muscleGroup: 'espalda',
    variants: ['dominadas', 'jalon-polea'],
    objectives: ['hipertrofia', 'fuerza'],
    tags: ['espalda', 'bodyweight', 'lastre', 'avanzado', 'fuerza'],
    cues: ['Cinturón de lastre ajustado antes de subir', 'Misma técnica que las dominadas estándar, sin compensar con el torso'],
  },
  {
    id: 'encogimientos-mancuernas',
    name: 'Encogimientos con mancuernas (shrugs)',
    group: 'trapecio',
    pattern: 'encogimiento',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Trapecio superior'], secondary: ['Elevador de la escápula'] },
    muscleGroup: 'trapecio',
    variants: ['encogimientos-trapecio'],
    objectives: ['hipertrofia'],
    tags: ['trapecios', 'aislamiento', 'mancuernas'],
    cues: ['Encogimiento puro vertical, sin rotar los hombros', 'Pausa de 1-2 seg en la contracción máxima'],
  },
  {
    id: 'jalon-agarre-supino',
    name: 'Jalón supino agarre estrecho en polea',
    pattern: 'traccion-vertical',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Bíceps braquial'], secondary: ['Romboides'] },
    muscleGroup: 'espalda',
    variants: ['jalon-polea', 'dominadas-supinas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'bíceps', 'polea', 'supino'],
    cues: ['Agarre supino a la anchura de hombros', 'Mayor activación del bíceps que el jalón prono'],
  },
  {
    id: 'remo-polea-triangulo',
    name: 'Remo en polea baja con agarre triangular',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho', 'Romboides'], secondary: ['Bíceps'] },
    muscleGroup: 'espalda',
    variants: ['remo-polea-baja', 'remo-maquina'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'agarre-neutro', 'polea'],
    cues: ['Agarre neutro con el triángulo reduce el estrés en la muñeca', 'Retrae escápulas activamente al final'],
  },
  {
    id: 'remo-banda',
    name: 'Remo con banda elástica',
    pattern: 'traccion-horizontal',
    category: 'traccion',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Romboides', 'Dorsal ancho'], secondary: ['Bíceps', 'Trapecio medio'] },
    muscleGroup: 'espalda',
    variants: ['remo-invertido', 'remo-polea-baja'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'banda', 'accesible', 'doméstico'],
    cues: ['Banda fijada a una puerta o poste a la altura del pecho', 'Retrae escápulas en el punto final del recorrido'],
  },

  // ── BÍCEPS ADICIONAL ──────────────────────────────────────────────────────────
  {
    id: 'curl-biceps-mancuernas',
    name: 'Curl de bíceps con mancuernas',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-martillo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['bíceps', 'aislamiento', 'mancuernas', 'principiante'],
    cues: ['Alterna o simultáneo, codos fijos a los costados', 'Supinación completa en el punto de máxima contracción'],
  },
  {
    id: 'curl-inclinado-mancuernas',
    name: 'Curl inclinado con mancuernas',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Bíceps braquial (cabeza larga)'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-mancuernas', 'curl-predicador'],
    objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'estiramiento', 'cabeza-larga'],
    cues: ['Banco a 45-60°, brazos cuelgan libremente a los lados', 'No balancees el torso, solo flexiona el codo desde el estiramiento'],
  },
  {
    id: 'curl-biceps-maquina',
    name: 'Curl de bíceps en máquina',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-predicador'],
    objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'máquina', 'principiante'],
    cues: ['Ajusta el pivote a la altura del codo', 'Pausa en el tope apretando el bíceps al máximo'],
  },
  {
    id: 'curl-polea-alta',
    name: 'Curl en polea alta (crucifix curl)',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-cable', 'curl-predicador'],
    objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'polea', 'estiramiento'],
    cues: ['Brazos en cruz a la altura del hombro en las dos poleas', 'Tensión máxima en el punto de estiramiento completo'],
  },
  {
    id: 'curl-biceps-banda',
    name: 'Curl de bíceps con banda elástica',
    pattern: 'flexion-codo',
    category: 'traccion',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial'] },
    muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-cable'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['bíceps', 'banda', 'accesible', 'doméstico'],
    cues: ['Pisa la banda con ambos pies a la anchura de hombros', 'Tensión desde el inicio, codos fijos a los costados'],
  },

  // ── FEMORAL / ISQUIOS ADICIONAL ───────────────────────────────────────────────
  {
    id: 'curl-femoral-sentado',
    name: 'Curl femoral sentado en máquina',
    pattern: 'flexion-rodilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 1,
    muscles: { primary: ['Isquios'], secondary: ['Gemelos'] },
    muscleGroup: 'isquios',
    variants: ['curl-femoral-tumbado', 'rdl-mancuernas'],
    objectives: ['hipertrofia'],
    tags: ['aislamiento', 'isquios', 'máquina', 'femoral'],
    cues: ['Posición sentada aumenta el estiramiento de isquios respecto al tumbado', 'Excéntrica lenta y controlada en el retorno'],
  },
  {
    id: 'curl-femoral-banda',
    name: 'Curl femoral con banda elástica',
    pattern: 'flexion-rodilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Isquios'], secondary: ['Gemelos'] },
    muscleGroup: 'isquios',
    variants: ['curl-femoral-tumbado', 'rdl-mancuernas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['isquios', 'banda', 'accesible', 'doméstico'],
    cues: ['Tumbado boca abajo, banda fijada detrás en la pared o mueble', 'Flexiona la rodilla contra la resistencia con control total'],
  },
  {
    id: 'peso-muerto-sumo',
    name: 'Peso muerto sumo con barra',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'intermedio',
    equipment: 'barra',
    compound: true,
    fatigueLoad: 5,
    technicalDifficulty: 4,
    muscles: { primary: ['Glúteos', 'Cuádriceps', 'Isquios'], secondary: ['Aductores', 'Erectores espinales'] },
    muscleGroup: 'gluteos',
    variants: ['peso-muerto', 'hip-thrust-barra'],
    objectives: ['fuerza', 'hipertrofia', 'rendimiento'],
    tags: ['compuesto', 'glúteos', 'isquios', 'aductores', 'barra'],
    cues: ['Stance ancho, puntas de pie apuntando 45°', 'Caderas más bajas que en el convencional al inicio del tirón'],
  },

  // ── GLÚTEOS ADICIONAL ─────────────────────────────────────────────────────────
  {
    id: 'hip-thrust-mancuernas',
    name: 'Hip thrust con mancuerna',
    group: 'gluteos',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra', 'puente-gluteo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'mancuernas', 'bisagra', 'accesible'],
    cues: ['Mancuerna sobre las caderas bien sujeta con ambas manos', 'Extensión completa de cadera en el tope apretando glúteos'],
  },
  {
    id: 'patada-gluteo-polea',
    unilateral: true,
    name: 'Patada de glúteo en polea (cable kickback)',
    group: 'gluteos',
    pattern: 'extension-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteo mayor'], secondary: ['Isquios'] },
    muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra', 'puente-gluteo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'aislamiento', 'polea', 'unilateral'],
    cues: ['Tobillera fija a la polea baja, ligeramente inclinado hacia adelante', 'Extiende la cadera hacia atrás manteniendo la espalda neutra'],
  },
  {
    id: 'patada-gluteo-banda',
    unilateral: true,
    name: 'Donkey kick con banda elástica',
    group: 'gluteos',
    pattern: 'extension-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteo mayor'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['patada-gluteo-polea', 'puente-gluteo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'bodyweight', 'banda', 'accesible', 'doméstico'],
    cues: ['A cuatro patas, banda en la corva del pie', 'Extiende la cadera hacia atrás hasta máxima extensión, pausa'],
  },
  {
    id: 'hip-thrust-banda',
    name: 'Hip thrust con banda elástica',
    group: 'gluteos',
    pattern: 'extension-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra', 'puente-gluteo'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'banda', 'accesible', 'doméstico'],
    cues: ['Banda sobre la cadera con extremos fijos a los pies o suelo', 'Extensión completa de cadera en el tope apretando glúteos'],
  },
  {
    id: 'pull-through-polea',
    name: 'Pull-through en polea baja',
    group: 'gluteos',
    pattern: 'bisagra',
    category: 'pierna',
    level: 'principiante',
    equipment: 'polea',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteos', 'Isquios'], secondary: ['Erectores espinales', 'Core'] },
    muscleGroup: 'gluteos',
    variants: ['peso-muerto-rumano', 'hip-thrust-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteos', 'isquios', 'bisagra', 'polea'],
    cues: ['De espaldas a la polea, cuerda entre las piernas', 'Empuja las caderas hacia adelante en una bisagra potente y controlada'],
  },

  // ── PIERNA ADICIONAL 2 ────────────────────────────────────────────────────────
  {
    id: 'zancada-caminando',
    unilateral: true,
    name: 'Zancada caminando con mancuernas',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'cuadriceps',
    variants: ['zancada-mancuernas', 'sentadilla-bulgara'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['pierna', 'unilateral', 'funcional', 'glúteos'],
    cues: ['Da pasos continuos hacia adelante', 'Rodilla trasera casi toca el suelo en cada repetición'],
  },
  {
    id: 'sentadilla-pistola',
    unilateral: true,
    name: 'Sentadilla pistola (pistol squat)',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'avanzado',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 5,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Isquios', 'Core', 'Tobillo'] },
    muscleGroup: 'cuadriceps',
    variants: ['sentadilla-bulgara', 'goblet-squat'],
    objectives: ['rendimiento', 'fuerza'],
    tags: ['pierna', 'bodyweight', 'avanzado', 'funcional', 'unilateral'],
    cues: ['Progresión: asistida en TRX o con apoyo de polea', 'Mantén la pierna libre extendida al frente durante todo el descenso'],
  },
  {
    id: 'sentadilla-banda',
    name: 'Sentadilla con banda elástica',
    pattern: 'sentadilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: true,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Isquios', 'Core'] },
    muscleGroup: 'cuadriceps',
    variants: ['goblet-squat', 'prensa-piernas'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'banda', 'accesible', 'doméstico', 'principiante'],
    cues: ['Banda bajo los pies y sobre los hombros o la cintura', 'Misma técnica que la sentadilla: pecho alto, rodillas alineadas con los pies'],
  },

  // ── GEMELO ADICIONAL ──────────────────────────────────────────────────────────
  {
    id: 'elevacion-talones-unilateral',
    unilateral: true,
    name: 'Elevación de talones unilateral',
    group: 'gemelos',
    pattern: 'aislamiento-pantorrilla',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Gemelos'], secondary: ['Sóleo'] },
    muscleGroup: 'gemelos',
    variants: ['elevacion-talones', 'elevacion-talones-bodyweight'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['gemelos', 'unilateral', 'bodyweight', 'accesible'],
    cues: ['Un pie sobre el borde de un escalón, el otro levantado', 'Rango completo con pausa de 1 seg en el estiramiento máximo'],
  },

  // ── CORE ADICIONAL 2 ──────────────────────────────────────────────────────────
  {
    id: 'plancha-lateral',
    name: 'Plancha lateral',
    unit: 'time',
    timeTarget: '20-45s',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Oblicuos', 'Cuadrado lumbar'], secondary: ['Glúteo medio', 'Core'] },
    muscleGroup: 'core',
    variants: ['plancha-frontal', 'copenhagen-plank'],
    objectives: ['hipertrofia', 'rendimiento', 'fuerza'],
    tags: ['core', 'lateral', 'anti-flexión-lateral', 'bodyweight'],
    cues: ['Cuerpo recto de cabeza a talones en el plano lateral', 'Caderas ni hundidas ni elevadas en exceso'],
  },
  {
    id: 'plancha-rll',
    name: 'Plancha con toque de hombro',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'intermedio',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Core', 'Transverso abdominal'], secondary: ['Deltoides anterior', 'Glúteos'] },
    muscleGroup: 'core',
    variants: ['plancha-frontal', 'dead-bug'],
    objectives: ['rendimiento', 'fuerza'],
    tags: ['core', 'antirrotación', 'dinámico', 'bodyweight'],
    cues: ['Pies ligeramente más abiertos para mayor base de apoyo', 'Las caderas no rotan al tocar el hombro contrario'],
  },
  {
    id: 'crunch-maquina',
    name: 'Crunch abdominal en máquina',
    pattern: 'core-flexion',
    category: 'core',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Recto abdominal'], secondary: ['Oblicuos'] },
    muscleGroup: 'core',
    variants: ['crunch-cable', 'elevacion-piernas-colgado'],
    objectives: ['hipertrofia'],
    tags: ['core', 'abdomen', 'máquina', 'principiante'],
    cues: ['Ajusta el peso para sentir tensión real en el abdomen', 'Enrolla la columna al contraer, no empujes con los brazos'],
  },
  {
    id: 'pallof-press-banda',
    name: 'Pallof press con banda elástica',
    pattern: 'core-antirrotacion',
    category: 'core',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Oblicuos', 'Transverso abdominal'], secondary: ['Core'] },
    muscleGroup: 'core',
    variants: ['pallof-press'],
    objectives: ['rendimiento', 'fuerza', 'recomp'],
    tags: ['core', 'antirrotación', 'banda', 'accesible', 'doméstico'],
    cues: ['Banda fijada a una columna o punto estable a la altura del pecho', 'Resiste activamente la rotación al extender los brazos'],
  },
  {
    id: 'bird-dog',
    name: 'Bird dog',
    pattern: 'core-antiextension',
    category: 'core',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Transverso abdominal', 'Erectores espinales'], secondary: ['Glúteos', 'Core'] },
    muscleGroup: 'core',
    variants: ['dead-bug', 'plancha-frontal'],
    objectives: ['rendimiento', 'recomp', 'fuerza'],
    tags: ['core', 'control-motor', 'antiextensión', 'rehab'],
    cues: ['A cuatro patas, columna completamente neutra', 'Extiende brazo y pierna contralateral sin rotar la pelvis'],
  },
  {
    id: 'rotacion-torso-polea',
    name: 'Rotación de torso en polea',
    pattern: 'core-antirrotacion',
    category: 'core',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Oblicuos', 'Recto abdominal'], secondary: ['Transverso abdominal'] },
    muscleGroup: 'core',
    variants: ['pallof-press', 'russian-twist'],
    objectives: ['hipertrofia', 'rendimiento'],
    tags: ['core', 'rotación', 'polea', 'oblicuos'],
    cues: ['Gira desde el torso, no desde los brazos ni las caderas', 'Polea a la altura media del pecho'],
  },

  // ── ABDUCTORES ────────────────────────────────────────────────────────────────
  {
    id: 'maquina-abductores',
    name: 'Máquina de abductores',
    group: 'abductores',
    pattern: 'abduccion-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'máquina',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteo medio', 'Tensor de la fascia lata'], secondary: ['Glúteo mayor'] },
    muscleGroup: 'abductores',
    variants: ['lateral-band-walk', 'hip-abduction-tumbado'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['abductores', 'glúteo-medio', 'aislamiento', 'máquina'],
    cues: ['Cadera ligeramente inclinada hacia adelante', 'Apertura sin compensar con el torso', 'Control en el retorno'],
  },
  {
    id: 'lateral-band-walk',
    name: 'Paso lateral con banda elástica',
    group: 'abductores',
    pattern: 'abduccion-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'bodyweight',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Glúteo medio', 'Tensor de la fascia lata'], secondary: ['Cuádriceps'] },
    muscleGroup: 'abductores',
    variants: ['maquina-abductores', 'hip-abduction-tumbado'],
    objectives: ['recomp', 'rendimiento', 'hipertrofia'],
    tags: ['abductores', 'glúteo-medio', 'funcional', 'banda'],
    cues: ['Banda por encima de las rodillas', 'Posición de squat durante todo el recorrido', 'Pasos lentos y controlados lateralmente'],
  },
  {
    id: 'hip-abduction-tumbado',
    name: 'Abducción de cadera con cable',
    group: 'abductores',
    pattern: 'abduccion-cadera',
    category: 'pierna',
    level: 'principiante',
    equipment: 'polea',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Glúteo medio'], secondary: ['Tensor de la fascia lata'] },
    muscleGroup: 'abductores',
    variants: ['maquina-abductores', 'lateral-band-walk'],
    objectives: ['hipertrofia'],
    tags: ['abductores', 'glúteo-medio', 'cable', 'aislamiento'],
    cues: ['De pie, cable en tobillo', 'Pierna de movimiento en extensión completa', 'Eleva a 45° sin inclinar el torso'],
  },

  // ── UNILATERALES CON MANCUERNA (lote validado por el entrenador) ──────────────
  {
    id: 'press-hombro-mancuerna-unilateral',
    name: 'Press de hombro unilateral con mancuerna',
    pattern: 'empuje-vertical',
    category: 'empuje',
    unilateral: true,
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 2,
    technicalDifficulty: 3,
    muscles: { primary: ['Deltoides ant.'], secondary: ['Tríceps', 'Deltoides medial', 'Core'] },
    muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas', 'press-arnold'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['hombros', 'unilateral', 'core', 'anti-flexión-lateral'],
    cues: ['De pie o sentado con una sola mancuerna', 'Aprieta glúteo y core para no inclinarte hacia el lado cargado', 'Sube sin arquear la lumbar', 'Baja controlado hasta la altura de la oreja'],
  },
  {
    id: 'elevacion-lateral-mancuerna-unilateral',
    name: 'Elevación lateral unilateral con mancuerna',
    group: 'delt_lat',
    pattern: 'aislamiento-hombro',
    category: 'empuje',
    unilateral: true,
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Deltoides medial'], secondary: [] },
    muscleGroup: 'delt_lat',
    variants: ['elevaciones-laterales', 'elevacion-lateral-polea-unilateral'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['aislamiento', 'hombros', 'deltoides-medial', 'unilateral'],
    cues: ['Sujétate con la mano libre a un soporte e inclínate un poco', 'Sube el codo, no la mano', 'Detén a la altura del hombro sin encoger el trapecio', 'Baja lento con tensión constante'],
  },
  {
    id: 'extension-triceps-mancuerna-unilateral',
    name: 'Extensión de tríceps unilateral con mancuerna',
    group: 'triceps',
    pattern: 'extension-codo',
    category: 'empuje',
    unilateral: true,
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 2,
    muscles: { primary: ['Tríceps braquial'], secondary: [] },
    muscleGroup: 'triceps',
    variants: ['overhead-tricep-extension', 'extension-triceps-unilateral-polea', 'kickback-triceps'],
    objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'unilateral', 'estiramiento', 'cabeza-larga'],
    cues: ['Brazo pegado a la cabeza, codo apuntando al techo', 'Baja la mancuerna tras la nuca hasta estirar', 'Extiende sin mover el brazo superior', 'Controla la bajada, no golpees el hombro'],
  },
  {
    id: 'rdl-unilateral-mancuerna',
    name: 'Peso muerto rumano a una pierna con mancuerna',
    pattern: 'bisagra',
    category: 'pierna',
    unilateral: true,
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 4,
    muscles: { primary: ['Isquios', 'Glúteos'], secondary: ['Erectores', 'Core'] },
    muscleGroup: 'isquios',
    variants: ['rdl-mancuernas', 'peso-muerto-rumano'],
    objectives: ['hipertrofia', 'recomp', 'rendimiento'],
    tags: ['isquios', 'glúteos', 'unilateral', 'equilibrio', 'funcional'],
    cues: ['Mancuerna en la mano contraria a la pierna de apoyo', 'Bisagra de cadera llevando la pierna libre atrás en línea con el torso', 'Espalda neutra y cadera nivelada (no la abras)', 'Sube apretando el glúteo de apoyo'],
  },
  {
    id: 'press-pecho-mancuerna-unilateral',
    name: 'Press de pecho unilateral con mancuerna',
    pattern: 'empuje-horizontal',
    category: 'empuje',
    unilateral: true,
    level: 'intermedio',
    equipment: 'mancuernas',
    compound: true,
    fatigueLoad: 3,
    technicalDifficulty: 3,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides ant.', 'Core'] },
    muscleGroup: 'pecho',
    variants: ['press-banca-mancuernas', 'press-banca-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'unilateral', 'core', 'anti-rotación'],
    cues: ['Tumbado en banco con una sola mancuerna', 'Resiste la rotación del torso hacia el lado cargado', 'Baja al costado del pecho con el codo a ~45°', 'Empuja sin perder la retracción escapular'],
  },
  {
    id: 'curl-alterno-mancuernas',
    name: 'Curl alterno de pie con mancuernas',
    group: 'biceps',
    pattern: 'flexion-codo',
    category: 'traccion',
    unilateral: true,
    level: 'principiante',
    equipment: 'mancuernas',
    compound: false,
    fatigueLoad: 1,
    technicalDifficulty: 1,
    muscles: { primary: ['Bíceps braquial'], secondary: ['Braquial', 'Antebrazo'] },
    muscleGroup: 'biceps',
    variants: ['curl-concentrado', 'curl-biceps-barra'],
    objectives: ['hipertrofia', 'recomp'],
    tags: ['bíceps', 'aislamiento', 'unilateral', 'alterno'],
    cues: ['Codos pegados al torso, alterna brazo a brazo', 'Supina la muñeca al subir', 'No balancees el torso', 'Baja controlado a extensión completa'],
  },

  // ═══════════════════════════════════════════════════════════════════════════
  // AMPLIACIÓN DE BIBLIOTECA · multipower, máquinas, peso libre, poleas, core
  // Clasificación P/S validada por el usuario. Criterios: isquios no secundario
  // en sentadillas/prensas; aductores sí en sentadilla profunda y zancadas; los
  // isométricos de core no suman a hombro/glúteo. Sin foto propia → placeholder.
  // ═══════════════════════════════════════════════════════════════════════════

  // ── Multipower (Smith) ───────────────────────────────────────────────────────
  {
    id: 'sentadilla-multipower', name: 'Sentadilla en multipower', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'multipower', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Aductores'] }, muscleGroup: 'cuadriceps',
    variants: ['hack-squat', 'prensa-piernas', 'sentadilla-pendulo'], objectives: ['hipertrofia', 'fuerza', 'recomp'],
    tags: ['pierna', 'cuádriceps', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'sentadilla guiada'],
    cues: ['La barra guiada fija la trayectoria: baja vertical', 'Pies algo adelantados para cargar cuádriceps', 'Rompe paralela si la movilidad lo permite', 'Empuja desde el medio del pie'],
  },
  {
    id: 'press-banca-multipower', name: 'Press banca en multipower', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'multipower', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides anterior'] }, muscleGroup: 'pecho',
    variants: ['press-banca-barra', 'press-banca-mancuernas', 'press-inclinado-multipower'], objectives: ['hipertrofia', 'fuerza', 'recomp'],
    tags: ['pecho', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'bench smith'],
    cues: ['Coloca el banco para que la barra caje al esternón', 'Escápulas retraídas y deprimidas', 'Trayectoria guiada: concéntrate en apretar el pecho', 'No bloquees codos en el top'],
  },
  {
    id: 'press-inclinado-multipower', name: 'Press inclinado en multipower', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'multipower', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Deltoides anterior', 'Tríceps'] }, muscleGroup: 'pecho',
    variants: ['press-inclinado-barra', 'press-inclinado-mancuernas', 'press-banca-multipower'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'superior', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'incline smith'],
    cues: ['Banco a 30–45°, énfasis en pectoral superior', 'La barra caje a la clavícula', 'Escápulas retraídas', 'Baja controlado sin rebotar'],
  },
  {
    id: 'press-militar-multipower', name: 'Press militar en multipower', pattern: 'empuje-vertical', category: 'empuje',
    level: 'principiante', equipment: 'multipower', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Deltoides anterior'], secondary: ['Deltoides lateral', 'Tríceps'] }, muscleGroup: 'delt_ant',
    variants: ['press-militar-barra', 'press-militar-mancuernas', 'press-hombro-pie-mancuernas'], objectives: ['hipertrofia', 'fuerza', 'recomp'],
    tags: ['hombro', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'shoulder press smith'],
    cues: ['Siéntate alineado con la barra guiada', 'Baja a la altura de la barbilla', 'No arquees la lumbar en exceso', 'Empuja hasta casi bloquear'],
  },
  {
    id: 'hip-thrust-multipower', name: 'Hip thrust en multipower', pattern: 'extension-cadera', category: 'pierna',
    level: 'principiante', equipment: 'multipower', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Glúteos'], secondary: [] }, muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra', 'hip-thrust-maquina', 'hip-thrust-mancuernas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteo', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'hip thrust', 'puente'],
    cues: ['Espalda alta apoyada en el banco', 'Barra guiada sobre la cadera (usa almohadilla)', 'Aprieta el glúteo arriba, costillas abajo', 'Barbilla al pecho, mirada neutra'],
  },
  {
    id: 'elevacion-talones-multipower', name: 'Elevación de talones en multipower', pattern: 'aislamiento-pantorrilla', category: 'pierna',
    level: 'principiante', equipment: 'multipower', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Gemelos'], secondary: [] }, muscleGroup: 'gemelos',
    variants: ['elevacion-talones'], objectives: ['hipertrofia'],
    tags: ['gemelo', 'pantorrilla', 'multipower', 'guiado'], aliases: ['smith', 'multipower', 'calf raise'],
    cues: ['Antepié en un step para ganar rango', 'Sube hasta la punta, aprieta arriba', 'Baja lento estirando el gemelo', 'Rodillas casi extendidas'],
  },

  // ── Máquinas ─────────────────────────────────────────────────────────────────
  {
    id: 'hip-thrust-maquina', name: 'Hip thrust en máquina', pattern: 'extension-cadera', category: 'pierna',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Glúteos'], secondary: [] }, muscleGroup: 'gluteos',
    variants: ['hip-thrust-barra', 'hip-thrust-multipower', 'hip-thrust-mancuernas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['glúteo', 'máquina'], aliases: ['hip thrust', 'puente', 'glute drive'],
    cues: ['Ajusta el respaldo a la base de las escápulas', 'Empuja con los talones', 'Aprieta el glúteo 1 s arriba', 'No arquees la lumbar al subir'],
  },
  {
    id: 'press-inclinado-maquina', name: 'Press inclinado en máquina', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Deltoides anterior', 'Tríceps'] }, muscleGroup: 'pecho',
    variants: ['press-inclinado-barra', 'press-inclinado-mancuernas', 'press-inclinado-multipower'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'superior', 'máquina'], aliases: ['incline machine', 'maquina pecho superior'],
    cues: ['Asiento de forma que las asas queden a la altura del pecho alto', 'Escápulas retraídas contra el respaldo', 'Aprieta el pecho al juntar', 'No bloquees codos'],
  },
  {
    id: 'jalon-maquina-convergente', name: 'Jalón en máquina (convergente)', pattern: 'traccion-vertical', category: 'traccion',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps', 'Trapecio'] }, muscleGroup: 'espalda',
    variants: ['jalon-polea', 'jalon-neutro', 'dominadas-asistidas-maquina', 'jalon-unilateral-polea'], objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'dorsal', 'máquina'], aliases: ['lat pulldown', 'jalón al pecho', 'convergente', 'iso-lateral'],
    cues: ['Pecho arriba, lleva los codos a los bolsillos', 'Inicia el tirón desde la espalda, no los brazos', 'Controla la subida sin encoger los hombros', 'Rango completo hasta estirar el dorsal'],
  },
  {
    id: 'remo-unilateral-maquina', name: 'Remo unilateral en máquina', pattern: 'traccion-horizontal', category: 'traccion',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 1, unilateral: true,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Trapecio', 'Deltoides posterior', 'Bíceps'] }, muscleGroup: 'espalda',
    variants: ['remo-maquina', 'jalon-maquina-convergente'], objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'dorsal', 'máquina', 'unilateral'], aliases: ['iso row', 'remo máquina', 'unilateral'],
    cues: ['Pecho apoyado, tira con un brazo', 'Lleva el codo atrás y abajo', 'Aprieta la escápula al final', 'Estira completo al volver'],
  },
  {
    id: 'dominadas-asistidas-maquina', name: 'Dominadas asistidas en máquina', pattern: 'traccion-vertical', category: 'traccion',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps', 'Trapecio'] }, muscleGroup: 'espalda',
    variants: ['dominadas', 'jalon-maquina-convergente', 'jalon-polea'], objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'dorsal', 'máquina', 'asistido', 'principiante'], aliases: ['assisted pull up', 'dominada asistida', 'gravitron'],
    cues: ['Apoya rodillas o pies en la plataforma', 'Usa la asistencia justa para 8–12 reps limpias', 'Tira con el dorsal hasta la barbilla', 'Baja controlado a brazos extendidos'],
  },
  {
    id: 'fondos-asistidos-maquina', name: 'Fondos asistidos en máquina', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor', 'Tríceps'], secondary: ['Deltoides anterior'] }, muscleGroup: 'pecho',
    variants: ['fondos-paralelas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'tríceps', 'máquina', 'asistido', 'principiante'], aliases: ['assisted dips', 'fondos asistidos', 'gravitron'],
    cues: ['Rodillas en la plataforma de asistencia', 'Inclínate al frente para más pecho, vertical para tríceps', 'Baja hasta sentir estiramiento sin forzar el hombro', 'Empuja hasta casi bloquear'],
  },
  {
    id: 'prensa-horizontal-sentado', name: 'Prensa horizontal (sentado)', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps'], secondary: ['Glúteos'] }, muscleGroup: 'cuadriceps',
    variants: ['prensa-piernas', 'hack-squat', 'sentadilla-pendulo'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'cuádriceps', 'máquina'], aliases: ['seated leg press', 'prensa horizontal'],
    cues: ['Espalda y cadera pegadas al respaldo', 'Pies a la anchura de hombros en la plataforma', 'Baja hasta 90° sin despegar la lumbar', 'Empuja sin bloquear de golpe'],
  },
  {
    id: 'sentadilla-pendulo', name: 'Sentadilla péndulo', pattern: 'sentadilla', category: 'pierna',
    level: 'intermedio', equipment: 'máquina', compound: true, fatigueLoad: 3, technicalDifficulty: 2,
    muscles: { primary: ['Cuádriceps'], secondary: ['Glúteos', 'Aductores'] }, muscleGroup: 'cuadriceps',
    variants: ['hack-squat', 'prensa-piernas', 'sentadilla-multipower', 'prensa-horizontal-sentado'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'cuádriceps', 'máquina'], aliases: ['pendulum squat', 'péndulo', 'pendulum'],
    cues: ['Espalda apoyada, pies en la plataforma arqueada', 'Baja profundo siguiendo el arco', 'Mantén el talón apoyado', 'Empuja desde el medio del pie'],
  },
  {
    id: 'curl-femoral-pie-unilateral', name: 'Curl femoral de pie unilateral', pattern: 'flexion-rodilla', category: 'pierna',
    level: 'principiante', equipment: 'máquina', compound: false, fatigueLoad: 1, technicalDifficulty: 1, unilateral: true,
    muscles: { primary: ['Isquiotibiales'], secondary: ['Gemelos'] }, muscleGroup: 'isquios',
    variants: ['curl-femoral-tumbado', 'curl-femoral-sentado'], objectives: ['hipertrofia'],
    tags: ['isquios', 'máquina', 'unilateral', 'aislamiento'], aliases: ['standing leg curl', 'femoral de pie'],
    cues: ['Cadera fija contra la almohadilla', 'Flexiona la rodilla llevando el talón al glúteo', 'Aprieta el isquio arriba', 'Baja lento sin soltar la carga'],
  },
  {
    id: 'patada-gluteo-maquina', name: 'Patada de glúteo en máquina', pattern: 'extension-cadera', category: 'pierna',
    level: 'principiante', equipment: 'máquina', compound: false, fatigueLoad: 1, technicalDifficulty: 1, unilateral: true,
    muscles: { primary: ['Glúteos'], secondary: [] }, muscleGroup: 'gluteos',
    variants: ['hip-thrust-maquina', 'patada-gluteo-polea'], objectives: ['hipertrofia'],
    tags: ['glúteo', 'máquina', 'aislamiento', 'unilateral'], aliases: ['glute kickback', 'patada glúteo', 'kickback'],
    cues: ['Apoya el tronco, empuja con el talón hacia atrás', 'Extiende la cadera sin arquear la lumbar', 'Aprieta el glúteo al final', 'Vuelve controlado'],
  },
  {
    id: 'extension-triceps-maquina', name: 'Extensión de tríceps en máquina', pattern: 'extension-codo', category: 'empuje',
    level: 'principiante', equipment: 'máquina', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Tríceps'], secondary: [] }, muscleGroup: 'triceps',
    variants: ['extensiones-triceps-polea', 'triceps-pushdown-cuerda', 'triceps-pushdown-barra'], objectives: ['hipertrofia'],
    tags: ['tríceps', 'máquina', 'aislamiento'], aliases: ['triceps machine', 'extensión tríceps máquina'],
    cues: ['Codos fijos en la almohadilla', 'Extiende hasta casi bloquear', 'Aprieta el tríceps abajo', 'Vuelve controlado sin soltar'],
  },
  {
    id: 'hiperextension-45', name: 'Hiperextensiones 45° (extensión lumbar)', pattern: 'extension-cadera', category: 'pierna',
    level: 'principiante', equipment: 'máquina', compound: true, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Erectores espinales', 'Glúteos'], secondary: ['Isquiotibiales'] }, muscleGroup: 'gluteos',
    variants: [], objectives: ['hipertrofia', 'rendimiento'],
    tags: ['lumbar', 'glúteo', 'cadena posterior', 'máquina'], aliases: ['hyperextension', 'back extension', 'extensión lumbar', 'banco romano'],
    cues: ['Almohadilla justo bajo la cadera', 'Baja plegando la cadera, no la lumbar', 'Sube hasta alinear tronco y piernas', 'Aprieta el glúteo arriba sin hiperextender'],
  },

  // ── Peso libre ───────────────────────────────────────────────────────────────
  {
    id: 'zancada-inversa-mancuernas', name: 'Zancada inversa con mancuernas', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'mancuernas', compound: true, fatigueLoad: 3, technicalDifficulty: 2, unilateral: true,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Aductores'] }, muscleGroup: 'cuadriceps',
    variants: ['zancada-mancuernas', 'zancada-caminando', 'sentadilla-bulgara', 'sentadilla-split-estatica-mancuernas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'unilateral', 'mancuernas'], aliases: ['reverse lunge', 'zancada atrás'],
    cues: ['Da el paso hacia atrás, baja la rodilla casi al suelo', 'Tronco erguido, peso en la pierna delantera', 'Empuja con el talón delantero para volver', 'Más fácil de estabilizar que la zancada hacia delante'],
  },
  {
    id: 'sentadilla-split-estatica-mancuernas', name: 'Sentadilla split (estática) con mancuernas', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'mancuernas', compound: true, fatigueLoad: 3, technicalDifficulty: 2, unilateral: true,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Aductores'] }, muscleGroup: 'cuadriceps',
    variants: ['sentadilla-bulgara', 'zancada-inversa-mancuernas', 'zancada-mancuernas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'unilateral', 'mancuernas'], aliases: ['split squat', 'sentadilla dividida'],
    cues: ['Pies en posición de paso fija, no te muevas', 'Baja vertical, rodilla trasera casi al suelo', 'Peso en la pierna delantera', 'Completa todas las reps antes de cambiar'],
  },
  {
    id: 'goblet-squat-mancuerna', name: 'Goblet squat con mancuerna', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'mancuernas', compound: true, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: ['Aductores'] }, muscleGroup: 'cuadriceps',
    variants: ['goblet-squat', 'prensa-piernas', 'sentadilla-banco-peso-corporal'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'cuádriceps', 'mancuernas', 'principiante'], aliases: ['goblet squat', 'sentadilla copa'],
    cues: ['Sujeta la mancuerna vertical contra el pecho', 'Baja entre las rodillas, profundo', 'Codos dentro de las rodillas abajo', 'Tronco erguido, talones apoyados'],
  },
  {
    id: 'peso-muerto-barra-hexagonal', name: 'Peso muerto con barra hexagonal', pattern: 'bisagra', category: 'pierna',
    level: 'intermedio', equipment: 'barra-hexagonal', compound: true, fatigueLoad: 4, technicalDifficulty: 3,
    muscles: { primary: ['Glúteos', 'Cuádriceps'], secondary: ['Isquiotibiales', 'Erectores espinales', 'Trapecio'] }, muscleGroup: 'gluteos',
    variants: ['swing-kettlebell'], objectives: ['hipertrofia', 'fuerza', 'rendimiento'],
    tags: ['cadena posterior', 'pierna', 'barra-hexagonal'], aliases: ['trap bar', 'hexagonal', 'trap bar deadlift'],
    cues: ['Dentro de la barra, agarre neutro a los lados', 'Pecho alto, espalda neutra', 'Empuja el suelo y extiende cadera y rodilla a la vez', 'Bloquea apretando el glúteo arriba'],
  },
  {
    id: 'swing-kettlebell', name: 'Swing con kettlebell', pattern: 'bisagra', category: 'pierna',
    level: 'intermedio', equipment: 'kettlebell', compound: true, fatigueLoad: 3, technicalDifficulty: 3,
    muscles: { primary: ['Glúteos', 'Isquiotibiales'], secondary: ['Erectores espinales'] }, muscleGroup: 'gluteos',
    variants: ['peso-muerto-barra-hexagonal', 'hip-thrust-mancuernas'], objectives: ['rendimiento', 'recomp'],
    tags: ['cadena posterior', 'glúteo', 'kettlebell', 'explosivo'], aliases: ['kettlebell swing', 'swing', 'balanceo'],
    cues: ['El movimiento es una bisagra de cadera, no una sentadilla', 'Proyecta la pesa con un golpe de cadera', 'Brazos relajados, la fuerza viene del glúteo', 'Espalda neutra en todo el recorrido'],
  },
  {
    id: 'aperturas-inclinadas-mancuernas', name: 'Aperturas inclinadas con mancuernas', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'mancuernas', compound: false, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Deltoides anterior'] }, muscleGroup: 'pecho',
    variants: ['aperturas-mancuernas'], objectives: ['hipertrofia'],
    tags: ['pecho', 'superior', 'aislamiento', 'mancuernas'], aliases: ['incline fly', 'aperturas inclinadas', 'fly'],
    cues: ['Banco a 30°, codos ligeramente flexionados y fijos', 'Abre en arco amplio hasta sentir estiramiento', 'Junta como si abrazaras un árbol', 'No conviertas el gesto en un press'],
  },
  {
    id: 'press-hombro-pie-mancuernas', name: 'Press de hombro de pie con mancuernas', pattern: 'empuje-vertical', category: 'empuje',
    level: 'intermedio', equipment: 'mancuernas', compound: true, fatigueLoad: 3, technicalDifficulty: 3,
    muscles: { primary: ['Deltoides anterior'], secondary: ['Deltoides lateral', 'Tríceps'] }, muscleGroup: 'delt_ant',
    variants: ['press-militar-mancuernas', 'press-militar-barra', 'press-militar-multipower'], objectives: ['hipertrofia', 'fuerza'],
    tags: ['hombro', 'de pie', 'mancuernas'], aliases: ['standing shoulder press', 'press militar de pie', 'overhead press'],
    cues: ['De pie, core y glúteo firmes para no arquear', 'Empuja las mancuernas sobre la cabeza', 'No bloquees de golpe los codos', 'Baja a la altura de las orejas'],
  },
  {
    id: 'elevacion-y-banco-inclinado', name: 'Elevación Y en banco inclinado', pattern: 'aislamiento-hombro', category: 'traccion',
    level: 'principiante', equipment: 'mancuernas', compound: false, fatigueLoad: 1, technicalDifficulty: 2,
    muscles: { primary: ['Deltoides lateral', 'Trapecio'], secondary: ['Deltoides posterior'] }, muscleGroup: 'delt_lat',
    variants: ['pajaros-mancuernas'], objectives: ['hipertrofia', 'rendimiento'],
    tags: ['hombro', 'trapecio inferior', 'salud del hombro', 'mancuernas'], aliases: ['Y raise', 'elevación en Y', 'prone Y'],
    cues: ['Tumbado boca abajo en banco inclinado', 'Sube los brazos en forma de Y, pulgares arriba', 'Inicia desde el trapecio inferior', 'Pesos ligeros, control total'],
  },
  {
    id: 'curl-barra-ez', name: 'Curl con barra EZ', pattern: 'flexion-codo', category: 'traccion',
    level: 'principiante', equipment: 'barra-ez', compound: false, fatigueLoad: 2, technicalDifficulty: 1,
    muscles: { primary: ['Bíceps'], secondary: ['Antebrazo'] }, muscleGroup: 'biceps',
    variants: ['curl-biceps-barra', 'curl-arana', 'curl-predicador'], objectives: ['hipertrofia', 'recomp'],
    tags: ['bíceps', 'barra-ez'], aliases: ['EZ bar curl', 'barra z', 'barra w', 'curl ez'],
    cues: ['Agarre en la zona angulada, más cómodo para la muñeca', 'Codos pegados al torso', 'Sube sin balancear', 'Baja a extensión completa controlando'],
  },
  {
    id: 'curl-arana', name: 'Curl araña (spider curl)', pattern: 'flexion-codo', category: 'traccion',
    level: 'principiante', equipment: 'mancuernas', compound: false, fatigueLoad: 1, technicalDifficulty: 2,
    muscles: { primary: ['Bíceps'], secondary: [] }, muscleGroup: 'biceps',
    variants: ['curl-predicador', 'curl-barra-ez'], objectives: ['hipertrofia'],
    tags: ['bíceps', 'aislamiento', 'pico'], aliases: ['spider curl', 'curl araña'],
    cues: ['Pecho apoyado en banco inclinado, brazos colgando', 'Sube sin mover el hombro', 'Aprieta el bíceps en el pico', 'Baja lento a extensión total'],
  },
  {
    id: 'press-frances-mancuernas', name: 'Press francés con mancuernas', pattern: 'extension-codo', category: 'empuje',
    level: 'principiante', equipment: 'mancuernas', compound: false, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Tríceps'], secondary: [] }, muscleGroup: 'triceps',
    variants: ['skull-crusher', 'triceps-pushdown-cuerda'], objectives: ['hipertrofia'],
    tags: ['tríceps', 'aislamiento', 'mancuernas'], aliases: ['french press', 'skull crusher mancuernas', 'francés'],
    cues: ['Tumbado, codos apuntando al techo y fijos', 'Baja las mancuernas junto a las orejas', 'Extiende sin abrir los codos', 'Controla la bajada, no rebotes'],
  },

  // ── Poleas ───────────────────────────────────────────────────────────────────
  {
    id: 'curl-bayesiano-polea', name: 'Curl bayesiano en polea', pattern: 'flexion-codo', category: 'traccion',
    level: 'intermedio', equipment: 'polea', compound: false, fatigueLoad: 1, technicalDifficulty: 2, unilateral: true,
    muscles: { primary: ['Bíceps'], secondary: [] }, muscleGroup: 'biceps',
    variants: ['curl-martillo-polea-cuerda'], objectives: ['hipertrofia'],
    tags: ['bíceps', 'polea', 'estiramiento', 'unilateral'], aliases: ['bayesian curl', 'curl bayesiano', 'cable curl'],
    cues: ['Polea baja detrás de ti, da un paso al frente', 'El brazo trabaja por detrás del cuerpo en estiramiento', 'Sube sin adelantar el codo', 'Tensión constante del cable, control al bajar'],
  },
  {
    id: 'curl-martillo-polea-cuerda', name: 'Curl martillo en polea con cuerda', pattern: 'flexion-codo', category: 'traccion',
    level: 'principiante', equipment: 'polea', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Bíceps'], secondary: ['Antebrazo'] }, muscleGroup: 'biceps',
    variants: ['curl-martillo', 'curl-bayesiano-polea'], objectives: ['hipertrofia'],
    tags: ['bíceps', 'braquial', 'antebrazo', 'polea'], aliases: ['cable hammer curl', 'curl martillo polea', 'rope curl'],
    cues: ['Agarre neutro de la cuerda (palmas enfrentadas)', 'Codos pegados, sube sin balancear', 'Aprieta arriba separando la cuerda', 'Baja con tensión constante'],
  },
  {
    id: 'jalon-unilateral-polea', name: 'Jalón unilateral en polea', pattern: 'traccion-vertical', category: 'traccion',
    level: 'principiante', equipment: 'polea', compound: true, fatigueLoad: 2, technicalDifficulty: 2, unilateral: true,
    muscles: { primary: ['Dorsal ancho'], secondary: ['Bíceps'] }, muscleGroup: 'espalda',
    variants: ['jalon-polea', 'jalon-neutro', 'jalon-maquina-convergente'], objectives: ['hipertrofia', 'recomp'],
    tags: ['espalda', 'dorsal', 'polea', 'unilateral'], aliases: ['single arm pulldown', 'jalón unilateral', 'lat pulldown'],
    cues: ['Agarre con un asa, siéntate estable', 'Tira del codo hacia la cadera', 'Deja que el dorsal se estire arriba', 'Sin girar el torso para ayudarte'],
  },
  {
    id: 'remo-menton-polea', name: 'Remo al mentón en polea', pattern: 'traccion-horizontal', category: 'traccion',
    level: 'principiante', equipment: 'polea', compound: false, fatigueLoad: 2, technicalDifficulty: 2,
    muscles: { primary: ['Deltoides lateral'], secondary: ['Trapecio'] }, muscleGroup: 'delt_lat',
    variants: ['remo-al-menton'], objectives: ['hipertrofia'],
    tags: ['hombro', 'deltoides lateral', 'trapecio', 'polea'], aliases: ['cable upright row', 'remo al mentón', 'upright row'],
    cues: ['Polea baja con barra o cuerda, agarre a la anchura de hombros', 'Sube los codos altos, por delante de las muñecas', 'No subas por encima de los hombros', 'Baja controlado sin encoger'],
  },
  {
    id: 'triceps-pushdown-cuerda', name: 'Extensión de tríceps en polea con cuerda', pattern: 'extension-codo', category: 'empuje',
    level: 'principiante', equipment: 'polea', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Tríceps'], secondary: [] }, muscleGroup: 'triceps',
    variants: ['triceps-pushdown-barra', 'extensiones-triceps-polea', 'extension-triceps-maquina'], objectives: ['hipertrofia'],
    tags: ['tríceps', 'polea', 'cuerda', 'aislamiento'], aliases: ['rope pushdown', 'pushdown cuerda', 'jalón tríceps'],
    cues: ['Codos pegados al torso y fijos', 'Extiende separando la cuerda abajo', 'Aprieta el tríceps al final', 'Vuelve controlado sin mover el codo'],
  },
  {
    id: 'triceps-pushdown-barra', name: 'Extensión de tríceps en polea con barra recta', pattern: 'extension-codo', category: 'empuje',
    level: 'principiante', equipment: 'polea', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Tríceps'], secondary: [] }, muscleGroup: 'triceps',
    variants: ['triceps-pushdown-cuerda', 'extensiones-triceps-polea'], objectives: ['hipertrofia'],
    tags: ['tríceps', 'polea', 'barra', 'aislamiento'], aliases: ['straight bar pushdown', 'pushdown barra', 'jalón tríceps'],
    cues: ['Agarre prono a la anchura de hombros', 'Codos fijos al costado', 'Extiende hasta bloquear abajo', 'Sube controlado hasta 90°'],
  },

  // ── Core, agarre y progresiones para principiantes ───────────────────────────
  {
    id: 'crunch-suelo', name: 'Crunch abdominal en el suelo', pattern: 'core-flexion', category: 'core',
    level: 'principiante', equipment: 'bodyweight', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Abdominales'], secondary: [] }, muscleGroup: 'core',
    variants: ['crunch-maquina', 'crunch-inverso'], objectives: ['hipertrofia'],
    tags: ['core', 'abdominales', 'suelo', 'principiante'], aliases: ['crunch', 'encogimiento abdominal'],
    cues: ['Rodillas flexionadas, lumbar pegada al suelo', 'Enrolla el tronco llevando las costillas a la cadera', 'Sube solo los omóplatos, no toda la espalda', 'Exhala al subir, baja lento'],
  },
  {
    id: 'crunch-inverso', name: 'Crunch inverso', pattern: 'core-flexion', category: 'core',
    level: 'principiante', equipment: 'bodyweight', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Abdominales'], secondary: [] }, muscleGroup: 'core',
    variants: ['crunch-suelo', 'elevacion-rodillas-paralelas', 'elevacion-piernas-colgado'], objectives: ['hipertrofia'],
    tags: ['core', 'abdominal inferior', 'suelo'], aliases: ['reverse crunch', 'crunch inverso'],
    cues: ['Tumbado, lleva las rodillas al pecho enrollando la cadera', 'Despega la cadera del suelo, no uses impulso', 'Controla la bajada', 'Mantén la lumbar estable'],
  },
  {
    id: 'elevacion-rodillas-paralelas', name: 'Elevación de rodillas en paralelas (silla romana)', pattern: 'core-flexion', category: 'core',
    level: 'principiante', equipment: 'máquina', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Abdominales'], secondary: [] }, muscleGroup: 'core',
    variants: ['elevacion-piernas-colgado', 'crunch-inverso'], objectives: ['hipertrofia'],
    tags: ['core', 'abdominal inferior', 'silla romana'], aliases: ['captain chair', 'knee raise', 'silla romana', 'paralelas'],
    cues: ['Apóyate en los antebrazos, espalda contra el respaldo', 'Sube las rodillas enrollando la cadera, no solo flexionando', 'Evita balancearte', 'Baja controlado sin arquear la lumbar'],
  },
  {
    id: 'dead-hang', name: 'Colgarse de la barra (dead hang)', pattern: 'aislamiento-antebrazo', category: 'traccion',
    level: 'principiante', equipment: 'bodyweight', compound: false, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Antebrazo'], secondary: [] }, muscleGroup: 'antebrazo',
    variants: [], objectives: ['rendimiento'],
    tags: ['agarre', 'antebrazo', 'isométrico', 'barra'], aliases: ['dead hang', 'colgarse', 'grip'],
    cues: ['Agarre firme a la anchura de hombros', 'Hombros activos, no del todo colgado', 'Respira y aguanta el tiempo objetivo', 'Baja controlado, no saltes al soltar'],
  },
  {
    id: 'flexiones-manos-elevadas', name: 'Flexiones con manos elevadas', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'bodyweight', compound: true, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides anterior'] }, muscleGroup: 'pecho',
    variants: ['push-up', 'flexiones-rodillas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'peso corporal', 'principiante', 'progresión'], aliases: ['incline push up', 'flexiones inclinadas', 'push up'],
    cues: ['Manos en un banco o barra a la altura adecuada', 'Cuanto más alto el apoyo, más fácil', 'Cuerpo recto de cabeza a talones', 'Baja el pecho a la superficie, empuja'],
  },
  {
    id: 'flexiones-rodillas', name: 'Flexiones de rodillas', pattern: 'empuje-horizontal', category: 'empuje',
    level: 'principiante', equipment: 'bodyweight', compound: true, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Pectoral mayor'], secondary: ['Tríceps', 'Deltoides anterior'] }, muscleGroup: 'pecho',
    variants: ['push-up', 'flexiones-manos-elevadas'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pecho', 'peso corporal', 'principiante', 'progresión'], aliases: ['knee push up', 'flexiones de rodillas', 'push up'],
    cues: ['Apoya las rodillas, cadera alineada con el tronco', 'No dejes caer la cadera', 'Baja el pecho casi al suelo', 'Empuja hasta extender los codos'],
  },
  {
    id: 'sentadilla-banco-peso-corporal', name: 'Sentadilla a banco con peso corporal', pattern: 'sentadilla', category: 'pierna',
    level: 'principiante', equipment: 'bodyweight', compound: true, fatigueLoad: 1, technicalDifficulty: 1,
    muscles: { primary: ['Cuádriceps', 'Glúteos'], secondary: [] }, muscleGroup: 'cuadriceps',
    variants: ['goblet-squat-mancuerna', 'prensa-piernas', 'sentadilla-pendulo'], objectives: ['hipertrofia', 'recomp'],
    tags: ['pierna', 'peso corporal', 'principiante', 'progresión'], aliases: ['box squat', 'sentadilla a cajón', 'sentadilla silla'],
    cues: ['Siéntate hacia un banco controlando la bajada', 'Roza el banco sin dejarte caer', 'Levántate empujando con los talones', 'Tronco erguido, rodillas hacia fuera'],
  },
];

// ─── Metadata ────────────────────────────────────────────────────────────────

const PATTERN_META = {
  'empuje-horizontal':     { label: 'Empuje horizontal',  short: 'Emp. H',  color: '#2A6FDB', bg: 'rgba(42,111,219,0.08)' },
  'empuje-vertical':       { label: 'Empuje vertical',    short: 'Emp. V',  color: '#2A6FDB', bg: 'rgba(42,111,219,0.08)' },
  'traccion-horizontal':   { label: 'Tracción horizontal', short: 'Trac. H', color: '#7C3AED', bg: 'rgba(124,58,237,0.08)' },
  'traccion-vertical':     { label: 'Tracción vertical',   short: 'Trac. V', color: '#7C3AED', bg: 'rgba(124,58,237,0.08)' },
  'sentadilla':            { label: 'Sentadilla',          short: 'Sent.',   color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'bisagra':               { label: 'Bisagra de cadera',   short: 'Bisagra', color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'core-antiextension':    { label: 'Core anti-extensión', short: 'Core',    color: '#1F8B3A', bg: 'rgba(31,139,58,0.08)' },
  'core-antirrotacion':    { label: 'Core anti-rotación',  short: 'Core',    color: '#1F8B3A', bg: 'rgba(31,139,58,0.08)' },
  'core-flexion':          { label: 'Core flexión',        short: 'Core',    color: '#1F8B3A', bg: 'rgba(31,139,58,0.08)' },
  'aislamiento-pantorrilla': { label: 'Pantorrilla',       short: 'Pant.',   color: '#5C6477', bg: 'rgba(92,100,119,0.08)' },
  // Aislamientos: el patrón describe el MOVIMIENTO; el músculo trabajado vive en
  // el campo `muscleGroup` (separado del patrón).
  'flexion-codo':          { label: 'Flexión de codo',     short: 'Bíceps',  color: '#7C3AED', bg: 'rgba(124,58,237,0.08)' },
  'extension-codo':        { label: 'Extensión de codo',   short: 'Tríceps', color: '#2A6FDB', bg: 'rgba(42,111,219,0.08)' },
  'aislamiento-hombro':    { label: 'Aislamiento de hombro', short: 'Hombro', color: '#2A6FDB', bg: 'rgba(42,111,219,0.08)' },
  'extension-rodilla':     { label: 'Extensión de rodilla', short: 'Cuád.',  color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'flexion-rodilla':       { label: 'Flexión de rodilla',  short: 'Isquios', color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'extension-cadera':      { label: 'Extensión de cadera', short: 'Glúteo',  color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'abduccion-cadera':      { label: 'Abducción de cadera', short: 'Abduct.', color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'aduccion-cadera':       { label: 'Aducción de cadera',  short: 'Aduct.',  color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  'encogimiento':          { label: 'Encogimiento',        short: 'Trapecio', color: '#7C3AED', bg: 'rgba(124,58,237,0.08)' },
  'aislamiento-antebrazo': { label: 'Antebrazo',           short: 'Anteb.',  color: '#5C6477', bg: 'rgba(92,100,119,0.08)' },
};

// muscleGroup → silhouette group (mapa corporal) y etiqueta legible. Separa el
// grupo muscular (fino: 18 grupos, incl. 3 cabezas de deltoides) del patrón de
// movimiento. Los consumidores (Coach, Builder, mapa) leen `muscleGroup`.
const MUSCLE_GROUP_META = {
  pecho:        { label: 'Pecho',             sil: 'pecho' },
  espalda:      { label: 'Espalda',           sil: 'espalda' },
  'espalda-baja':{ label: 'Espalda baja',     sil: 'espalda' },
  trapecio:     { label: 'Trapecio',          sil: 'espalda' },
  delt_ant:     { label: 'Deltoides anterior', sil: 'hombro' },
  delt_lat:     { label: 'Deltoides lateral',  sil: 'hombro' },
  delt_post:    { label: 'Deltoides posterior', sil: 'hombro' },
  biceps:       { label: 'Bíceps',            sil: 'biceps' },
  triceps:      { label: 'Tríceps',           sil: 'triceps' },
  antebrazo:    { label: 'Antebrazo',         sil: 'biceps' },
  cuadriceps:   { label: 'Cuádriceps',        sil: 'pierna' },
  isquios:      { label: 'Isquios',           sil: 'pierna' },
  gluteos:      { label: 'Glúteos',           sil: 'pierna' },
  abductores:   { label: 'Abductores',        sil: 'pierna' },
  aductores:    { label: 'Aductores',         sil: 'pierna' },
  gemelos:      { label: 'Gemelos',           sil: 'pierna' },
  tibial:       { label: 'Tibial',            sil: 'pierna' },
  core:         { label: 'Core',              sil: 'core' },
};

const EQUIPMENT_META = {
  barra:       { label: 'Barra',       color: '#0F1A2E', bg: 'rgba(15,26,46,0.07)' },
  mancuernas:  { label: 'Mancuernas',  color: '#1a4fa0', bg: 'rgba(42,111,219,0.08)' },
  bodyweight:  { label: 'Bodyweight',  color: '#1F8B3A', bg: 'rgba(31,139,58,0.08)' },
  polea:       { label: 'Polea',       color: '#C24545', bg: 'rgba(194,69,69,0.08)' },
  máquina:     { label: 'Máquina',     color: '#5C6477', bg: 'rgba(92,100,119,0.12)' },
  kettlebell:  { label: 'Kettlebell',  color: '#D97706', bg: 'rgba(217,119,6,0.08)' },
  rueda:       { label: 'Rueda ab.',   color: '#5C6477', bg: 'rgba(92,100,119,0.12)' },
  disco:       { label: 'Disco',       color: '#1a4fa0', bg: 'rgba(42,111,219,0.08)' },
  multipower:  { label: 'Multipower (Smith)', color: '#5C6477', bg: 'rgba(92,100,119,0.12)' },
  'barra-hexagonal': { label: 'Barra hexagonal', color: '#0F1A2E', bg: 'rgba(15,26,46,0.07)' },
  'barra-ez':  { label: 'Barra EZ',    color: '#0F1A2E', bg: 'rgba(15,26,46,0.07)' },
  landmine:    { label: 'Landmine',    color: '#0F1A2E', bg: 'rgba(15,26,46,0.07)' },
  suspension:  { label: 'Suspensión (TRX)', color: '#1F8B3A', bg: 'rgba(31,139,58,0.08)' },
};

// Objective weights: how to score and select exercises
const OBJECTIVE_WEIGHTS = {
  hipertrofia: { compoundBonus: 40, isolationBonus: 20, fatigueMax: 5, techMin: 1, techMax: 4 },
  fuerza:      { compoundBonus: 80, isolationBonus: 0,  fatigueMax: 5, techMin: 3, techMax: 5 },
  recomp:      { compoundBonus: 50, isolationBonus: 15, fatigueMax: 4, techMin: 1, techMax: 4 },
  rendimiento: { compoundBonus: 70, isolationBonus: 5,  fatigueMax: 5, techMin: 3, techMax: 5 },
};

// Which movement patterns each session type should cover
const SESSION_PATTERN_MAP = {
  'Push':    [{ p: 'empuje-horizontal', n: 2 }, { p: 'empuje-vertical', n: 2 }],
  'Pull':    [{ p: 'traccion-vertical', n: 2 }, { p: 'traccion-horizontal', n: 2 }],
  'Legs':    [{ p: 'sentadilla', n: 2 }, { p: 'bisagra', n: 2 }, { p: 'aislamiento-pantorrilla', n: 1 }],
  'Upper A': [{ p: 'empuje-horizontal', n: 2 }, { p: 'traccion-vertical', n: 2 }, { p: 'empuje-vertical', n: 1 }],
  'Upper B': [{ p: 'empuje-vertical', n: 2 }, { p: 'traccion-horizontal', n: 2 }, { p: 'empuje-horizontal', n: 1 }],
  'Lower A': [{ p: 'sentadilla', n: 2 }, { p: 'bisagra', n: 2 }],
  'Lower B': [{ p: 'bisagra', n: 2 }, { p: 'sentadilla', n: 2 }],
  'Full A':  [{ p: 'sentadilla', n: 1 }, { p: 'empuje-horizontal', n: 1 }, { p: 'traccion-vertical', n: 1 }, { p: 'bisagra', n: 1 }],
  'Full B':  [{ p: 'bisagra', n: 1 }, { p: 'empuje-vertical', n: 1 }, { p: 'traccion-horizontal', n: 1 }, { p: 'sentadilla', n: 1 }],
  'Full C':  [{ p: 'sentadilla', n: 1 }, { p: 'empuje-horizontal', n: 1 }, { p: 'traccion-horizontal', n: 1 }, { p: 'bisagra', n: 1 }],
};

// ─── Core scoring function ─────────────────────────────────────────────────────

function scoreExercise(ex, objetivo, nivel, usedPatternCounts) {
  const w = OBJECTIVE_WEIGHTS[objetivo] || OBJECTIVE_WEIGHTS.hipertrofia;
  let score = 100;

  // Compound preference per objective
  score += ex.compound ? w.compoundBonus : w.isolationBonus;

  // Technical difficulty fit
  if (ex.technicalDifficulty >= w.techMin && ex.technicalDifficulty <= w.techMax) score += 20;
  else score -= 15;

  // Level match
  if (ex.level === nivel) score += 30;
  else if (ex.level === 'principiante') score += 10;
  else if (ex.level === 'avanzado' && nivel !== 'avanzado') score -= 40;

  // Fatigue ceiling
  if (ex.fatigueLoad > w.fatigueMax) score -= 60;

  // Slightly prefer variety (penalize patterns already well-represented)
  const patternCount = usedPatternCounts[ex.pattern] || 0;
  score -= patternCount * 8;

  return score;
}

// ─── Fuzzy, accent-insensitive exercise search ─────────────────────────────────
// Tolerates missing accents, casing, word order, small typos, and searches over
// name + muscles + pattern + equipment, with a small gym-synonym dictionary.

// Strip diacritics + lowercase + trim.
function _srchNorm(s) {
  return (s == null ? '' : String(s)).normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase().trim();
}

// Bidirectional synonym groups (gym slang / EN-ES / common variants). Add rows to extend.
const SEARCH_SYNONYMS = [
  ['pecho', 'pectoral', 'pectorales', 'pec', 'pecs', 'chest'],
  ['espalda', 'dorsal', 'dorsales', 'lat', 'lats', 'back'],
  ['pierna', 'piernas', 'cuadriceps', 'cuadricep', 'quad', 'quads', 'legs', 'leg'],
  ['gluteo', 'gluteos', 'glute', 'glutes'],
  ['gemelo', 'gemelos', 'pantorrilla', 'pantorrillas', 'soleo', 'calf', 'calves'],
  ['isquios', 'isquio', 'isquiosurales', 'femoral', 'hamstring', 'hamstrings'],
  ['hombro', 'hombros', 'deltoides', 'deltoide', 'delt', 'delts', 'shoulder', 'shoulders'],
  ['biceps', 'bicep'],
  ['triceps', 'tricep'],
  ['dominadas', 'dominada', 'pull up', 'pullup', 'chin up', 'chinup'],
  ['fondos', 'fondo', 'dips', 'dip', 'paralelas'],
  ['peso muerto', 'deadlift', 'muerto'],
  ['sentadilla', 'sentadillas', 'squat', 'squats'],
  ['polea', 'poleas', 'cable', 'cables'],
  ['mancuernas', 'mancuerna', 'dumbbell', 'dumbbells'],
  ['barra', 'barbell'],
  ['maquina', 'machine'],
  ['empuje', 'push'],
  ['traccion', 'tiron', 'pull', 'jalar'],
  ['cadera', 'bisagra', 'hinge'],
  ['aperturas', 'apertura', 'fly', 'flyes', 'flies', 'cruce', 'crossover'],
  ['curl', 'curls'],
  ['press', 'presses'],
  ['prensa', 'leg press'],
  ['multipower', 'smith', 'maquina smith'],
  ['hexagonal', 'trap bar', 'trapbar', 'barra hexagonal'],
  ['hip thrust', 'hipthrust', 'puente', 'empuje de cadera'],
  ['jalon', 'lat pulldown', 'pulldown', 'jalon al pecho'],
  ['hack', 'pendulo', 'pendulum'],
  ['rdl', 'rumano', 'romanian'],
  ['face pull', 'facepull'],
  ['pushdown', 'jalon triceps'],
  ['skull', 'frances', 'skullcrusher', 'press frances'],
  ['ez', 'barra z', 'barra w'],
  ['swing', 'balanceo'],
  ['trx', 'suspension', 'anillas'],
  ['landmine'],
];
const _synIndex = (() => {
  const m = new Map();
  for (const g of SEARCH_SYNONYMS) {
    const ng = g.map(_srchNorm);
    for (const t of ng) { const set = m.get(t) || new Set(); ng.forEach(x => set.add(x)); m.set(t, set); }
  }
  return m;
})();
function _srchExpand(tok) {
  const s = _synIndex.get(tok);
  return s ? [...new Set([tok, ...s])] : [tok];
}

// Bounded Levenshtein — returns max+1 as soon as it can't fit within `max`.
function _srchLev(a, b, max) {
  if (Math.abs(a.length - b.length) > max) return max + 1;
  const dp = Array.from({ length: a.length + 1 }, (_, i) => i);
  for (let j = 1; j <= b.length; j++) {
    let prev = dp[0]; dp[0] = j; let best = dp[0];
    for (let i = 1; i <= a.length; i++) {
      const tmp = dp[i];
      dp[i] = Math.min(dp[i] + 1, dp[i - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
      prev = tmp; if (dp[i] < best) best = dp[i];
    }
    if (best > max) return max + 1;
  }
  return dp[a.length];
}

// Per-exercise searchable haystack (memoised): normalized name, a full string of
// name + muscles + pattern label + equipment label + tags, and its word set.
const _hayCache = new Map();
function _srchHay(ex) {
  let h = _hayCache.get(ex.id);
  if (h) return h;
  const parts = [ex.name || ''];
  (ex.muscles?.primary || []).forEach(m => parts.push(m));
  (ex.muscles?.secondary || []).forEach(m => parts.push(m));
  (ex.tags || []).forEach(t => parts.push(t));
  // Alias de gimnasio (es/en): "smith", "hip thrust", "lat pulldown", "trap bar"…
  (ex.aliases || []).forEach(a => parts.push(a));
  const pm = PATTERN_META[ex.pattern]; if (pm) { parts.push(pm.label, pm.short); } parts.push(ex.pattern || '');
  const em = EQUIPMENT_META[ex.equipment]; if (em) parts.push(em.label); parts.push(ex.equipment || '');
  parts.push(ex.category || '');
  const name = _srchNorm(ex.name || '');
  const full = _srchNorm(parts.join(' '));
  const words = new Set(full.split(/[\s,\/()·.\-]+/).filter(w => w.length >= 2));
  h = { name, full, words };
  _hayCache.set(ex.id, h);
  return h;
}

// Quality of one query token against one exercise (0 = no match). Higher = better.
function _srchTokenQuality(tok, hay) {
  let best = 0;
  for (const e of _srchExpand(tok)) {
    if (e.length < 2) { if (hay.full.includes(e)) best = Math.max(best, 3); continue; }
    if (hay.full.includes(e)) { best = Math.max(best, hay.name.includes(e) ? 6 : 4); continue; }
    // Una expansión con varias palabras (p. ej. el sinónimo "maquina smith") solo
    // cuenta como coincidencia de FRASE (comprobado arriba): no se mete en el bucle
    // de solapamiento por palabra, que haría que `"maquina smith".includes("maquina")`
    // marcara TODAS las máquinas al buscar "smith".
    if (e.indexOf(' ') !== -1) continue;
    const max = e.length <= 4 ? 1 : 2;   // typo tolerance grows with token length
    for (const w of hay.words) {
      if (w.includes(e) || e.includes(w)) { best = Math.max(best, 3); break; }
      if (Math.abs(w.length - e.length) <= max) {
        const d = _srchLev(e, w, max);
        if (d <= max) best = Math.max(best, d === 1 ? 2 : 1);
      }
    }
  }
  return best;
}

// Every query word must match (in any order); results ranked by total quality.
function _srchSearch(query, list) {
  const q = _srchNorm(query);
  if (!q) return list.slice();
  const toks = q.split(/\s+/).filter(Boolean);
  const scored = [];
  for (const ex of list) {
    const hay = _srchHay(ex);
    let total = 0, ok = true;
    for (const t of toks) {
      const qt = _srchTokenQuality(t, hay);
      if (qt === 0) { ok = false; break; }
      total += qt;
    }
    if (!ok) continue;
    if (hay.name.includes(q)) total += 8;                 // whole phrase in the name
    if (hay.name.startsWith(toks[0])) total += 2;         // prefix nicety
    scored.push({ ex, score: total });
  }
  scored.sort((a, b) => b.score - a.score || a.ex.name.length - b.ex.name.length);
  return scored.map(s => s.ex);
}

// Near-misses for "¿Quisiste decir…?" — ranked by how many tokens partially match.
function _srchSuggest(query, limit) {
  const q = _srchNorm(query);
  if (!q) return [];
  const toks = q.split(/\s+/).filter(Boolean);
  const scored = EXERCISES_DB.map(ex => {
    const hay = _srchHay(ex);
    let matched = 0, total = 0;
    for (const t of toks) { const qt = _srchTokenQuality(t, hay); if (qt > 0) { matched++; total += qt; } }
    return { ex, matched, total };
  }).filter(s => s.matched > 0)
    .sort((a, b) => b.matched - a.matched || b.total - a.total || a.ex.name.length - b.ex.name.length);
  return scored.slice(0, limit || 6).map(s => s.ex);
}

// ─── Public API ───────────────────────────────────────────────────────────────

const ExerciseService = {

  getAll(filters = {}) {
    let list = [...EXERCISES_DB];
    if (filters.pattern) list = list.filter(e => e.pattern === filters.pattern);
    if (filters.category) list = list.filter(e => e.category === filters.category);
    if (filters.equipment) list = list.filter(e => e.equipment === filters.equipment);
    if (filters.level) list = list.filter(e => e.level === filters.level);
    if (filters.objective) list = list.filter(e => e.objectives.includes(filters.objective));
    if (filters.compound !== undefined) list = list.filter(e => e.compound === filters.compound);
    if (filters.query) list = _srchSearch(filters.query, list);
    return list;
  },

  // Fuzzy, accent/word-order/typo-tolerant search over name·músculos·patrón·equipo.
  search(query, limit) {
    const r = _srchSearch(query, EXERCISES_DB);
    return limit ? r.slice(0, limit) : r;
  },
  // Same, but restricted to a caller-provided subset (e.g. a muscle-filtered list).
  searchIn(list, query) { return _srchSearch(query, list || EXERCISES_DB); },
  // Near-miss suggestions when a search returns nothing.
  suggest(query, limit) { return _srchSuggest(query, limit); },

  getById(id) {
    return EXERCISES_DB.find(e => e.id === id) || null;
  },

  getVariants(id) {
    const ex = ExerciseService.getById(id);
    if (!ex) return [];
    return ex.variants.map(vid => ExerciseService.getById(vid)).filter(Boolean);
  },

  // Smart substitutes for an exercise (used when a machine is occupied mid-workout).
  // Ranks by keeping the training intent: same movement pattern and same primary
  // muscles first, so an occupied incline dumbbell press yields incline machine /
  // Smith / barbell press — never a biceps curl. `ref` may be a DB id, a full DB
  // entry, or a session exercise carrying { id, pattern, muscles }.
  alternativesFor(ref, limit = 12) {
    const base = (typeof ref === 'string')
      ? ExerciseService.getById(ref)
      : (ExerciseService.getById(ref?.id) || ref);
    if (!base) return [];

    const norm = m => (m || '').toLowerCase();
    const toArr = m => Array.isArray(m) ? m : (m?.primary ? m.primary : []);
    const basePrim = new Set(toArr(base.muscles).map(norm));
    const baseSec  = new Set((base.muscles?.secondary || []).map(norm));
    const baseVariants = new Set(base.variants || []);
    const overlap = (arr, set) => (arr || []).reduce((n, m) => n + (set.has(norm(m)) ? 1 : 0), 0);

    // Exclude the exercise itself — by id AND by normalized name, since a
    // session exercise's id may not match the DB (e.g. routines built elsewhere),
    // which would otherwise surface an identical entry as the top "alternative".
    const baseName = (base.name || '').trim().toLowerCase();
    const scored = EXERCISES_DB
      .filter(e => e.id !== base.id && (e.name || '').trim().toLowerCase() !== baseName)
      .map(e => {
        const samePattern = base.pattern && e.pattern === base.pattern;
        const sameGroup   = base.muscleGroup && e.muscleGroup === base.muscleGroup;
        const primShared  = overlap(e.muscles?.primary, basePrim);
        const secShared   = overlap(e.muscles?.secondary, baseSec);
        const isVariant   = baseVariants.has(e.id) || (e.variants || []).includes(base.id);
        let score = 0;
        if (sameGroup)             score += 100;   // mismo grupo muscular (campo nuevo)
        if (samePattern)           score += 120;   // mismo patrón de movimiento
        score += primShared * 60;
        score += secShared * 8;
        if (isVariant)             score += 90;
        if (e.category === base.category) score += 15;
        return { ex: e, score, samePattern, sameGroup, primShared };
      })
      // Substitutos con sentido: mismo grupo muscular, mismo patrón o músculo primario
      .filter(x => x.sameGroup || x.samePattern || x.primShared > 0)
      .sort((a, b) => b.score - a.score);

    return scored.slice(0, limit).map(x => x.ex);
  },

  // Smart exercise selection for a given session type, objetivo, nivel, tiempo
  selectForSession(sessionLabel, objetivo, nivel, tiempo, excludeIds = []) {
    const slots = SESSION_PATTERN_MAP[sessionLabel] || SESSION_PATTERN_MAP['Full A'];
    const maxEx = tiempo <= 45 ? 4 : tiempo <= 60 ? 5 : 7;
    const selected = [];
    const usedIds = new Set(excludeIds);
    const usedPatternCounts = {};

    for (const slot of slots) {
      if (selected.length >= maxEx) break;

      const candidates = EXERCISES_DB.filter(ex =>
        ex.pattern === slot.p &&
        !usedIds.has(ex.id) &&
        ex.objectives.includes(objetivo) &&
        (nivel === 'principiante' ? ex.level !== 'avanzado' : true)
      );

      const scored = candidates
        .map(ex => ({ ...ex, _score: scoreExercise(ex, objetivo, nivel, usedPatternCounts) }))
        .sort((a, b) => b._score - a._score);

      const toAdd = scored.slice(0, Math.min(slot.n, maxEx - selected.length));
      toAdd.forEach(ex => {
        selected.push(ex);
        usedIds.add(ex.id);
        usedPatternCounts[ex.pattern] = (usedPatternCounts[ex.pattern] || 0) + 1;
      });
    }

    // Add one core exercise if time allows
    if (tiempo >= 60 && selected.length < maxEx) {
      const corePatterns = ['core-antiextension', 'core-antirrotacion', 'core-flexion'];
      const coreEx = EXERCISES_DB.find(ex =>
        corePatterns.includes(ex.pattern) &&
        !usedIds.has(ex.id) &&
        (nivel === 'principiante' ? ex.level !== 'avanzado' : true)
      );
      if (coreEx) selected.push(coreEx);
    }

    return selected;
  },

  // Suggest exercises to complement an existing workout (for Builder "Sugeridos" tab)
  suggestForWorkout(currentExercises, objetivo = 'hipertrofia', nivel = 'intermedio', limit = 5) {
    const usedIds = new Set(currentExercises.map(e => e.id));
    const patternCounts = {};
    currentExercises.forEach(ex => {
      patternCounts[ex.pattern] = (patternCounts[ex.pattern] || 0) + 1;
    });

    // Identify the most under-represented antagonist
    const pushCount = (patternCounts['empuje-horizontal'] || 0) + (patternCounts['empuje-vertical'] || 0);
    const pullCount = (patternCounts['traccion-horizontal'] || 0) + (patternCounts['traccion-vertical'] || 0);
    const quadCount = patternCounts['sentadilla'] || 0;
    const postCount = patternCounts['bisagra'] || 0;
    const coreCount = (patternCounts['core-antiextension'] || 0) + (patternCounts['core-antirrotacion'] || 0) + (patternCounts['core-flexion'] || 0);

    // Build inverse-frequency score for pattern suggestions
    const inversePatternWeights = {};
    Object.keys(PATTERN_META).forEach(p => {
      inversePatternWeights[p] = 1 / ((patternCounts[p] || 0) + 1);
    });

    // Boost antagonist patterns
    if (pushCount > pullCount) {
      inversePatternWeights['traccion-horizontal'] *= 3;
      inversePatternWeights['traccion-vertical'] *= 3;
    }
    if (pullCount > pushCount) {
      inversePatternWeights['empuje-horizontal'] *= 3;
      inversePatternWeights['empuje-vertical'] *= 3;
    }
    if (quadCount > postCount) {
      inversePatternWeights['bisagra'] *= 3;
    }
    if (postCount > quadCount) {
      inversePatternWeights['sentadilla'] *= 3;
    }
    if (coreCount === 0 && currentExercises.length >= 3) {
      inversePatternWeights['core-antiextension'] *= 5;
      inversePatternWeights['core-antirrotacion'] *= 5;
    }

    const scored = EXERCISES_DB
      .filter(ex =>
        !usedIds.has(ex.id) &&
        ex.objectives.includes(objetivo) &&
        (nivel === 'principiante' ? ex.level !== 'avanzado' : true)
      )
      .map(ex => ({
        ...ex,
        _score: scoreExercise(ex, objetivo, nivel, patternCounts) * (inversePatternWeights[ex.pattern] || 1),
      }))
      .sort((a, b) => b._score - a._score);

    return scored.slice(0, limit);
  },

  // Compute push:pull and quad:posterior balance ratios
  computeBalance(exercises) {
    const push = exercises.filter(e => e.pattern === 'empuje-horizontal' || e.pattern === 'empuje-vertical').length;
    const pull = exercises.filter(e => e.pattern === 'traccion-horizontal' || e.pattern === 'traccion-vertical').length;
    const quad = exercises.filter(e => e.pattern === 'sentadilla').length;
    const post = exercises.filter(e => e.pattern === 'bisagra').length;
    const core = exercises.filter(e => e.pattern.startsWith('core')).length;
    return { push, pull, quad, post, core };
  },

  // For protocol display: return the reason an exercise was selected
  getSelectionReason(ex, objetivo, nivel) {
    const reasons = [];
    if (ex.compound && (objetivo === 'fuerza' || objetivo === 'rendimiento')) reasons.push('ejercicio compuesto clave');
    if (ex.level === nivel) reasons.push(`nivel ${nivel}`);
    if (ex.fatigueLoad >= 4) reasons.push('alto estímulo mecánico');
    if (ex.fatigueLoad <= 2) reasons.push('bajo costo de fatiga');
    if (ex.tags.includes('clásico')) reasons.push('evidencia sólida');
    return reasons.slice(0, 2).join(' · ') || 'seleccionado para este contexto';
  },

  META: { PATTERN_META, EQUIPMENT_META, OBJECTIVE_WEIGHTS },
};

Object.assign(window, { ExerciseService, PATTERN_META, MUSCLE_GROUP_META });
