import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:trainhub_flutter/domain/entities/exercise.dart'; import 'package:trainhub_flutter/domain/entities/training_plan.dart'; import 'package:trainhub_flutter/domain/entities/training_section.dart'; import 'package:trainhub_flutter/presentation/plan_editor/plan_editor_controller.dart'; import 'package:trainhub_flutter/presentation/plan_editor/widgets/plan_exercise_tile.dart'; class PlanSectionCard extends ConsumerWidget { final TrainingSectionEntity section; final int sectionIndex; final TrainingPlanEntity plan; final List availableExercises; const PlanSectionCard({ super.key, required this.section, required this.sectionIndex, required this.plan, required this.availableExercises, }); @override Widget build(BuildContext context, WidgetRef ref) { final controller = ref.read(planEditorControllerProvider(plan.id).notifier); return Card( margin: const EdgeInsets.only(bottom: 16), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: TextField( controller: TextEditingController(text: section.name) ..selection = TextSelection.fromPosition( TextPosition(offset: section.name.length), ), decoration: const InputDecoration( border: InputBorder.none, hintText: 'Section Name', isDense: true, ), style: Theme.of(context).textTheme.titleMedium, onChanged: (val) => controller.updateSectionName(sectionIndex, val), ), ), IconButton( icon: const Icon(Icons.delete_outline), onPressed: () => controller.deleteSection(sectionIndex), ), ], ), const Divider(), ReorderableListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: section.exercises.length, onReorder: (oldIndex, newIndex) => controller.reorderExercise(sectionIndex, oldIndex, newIndex), itemBuilder: (context, index) { final exercise = section.exercises[index]; return PlanExerciseTile( key: ValueKey(exercise.instanceId), exercise: exercise, sectionIndex: sectionIndex, exerciseIndex: index, plan: plan, ); }, ), const SizedBox(height: 8), Center( child: TextButton.icon( onPressed: () { _showExercisePicker(context, (exercise) { controller.addExerciseToSection(sectionIndex, exercise); }); }, icon: const Icon(Icons.add), label: const Text('Add Exercise'), ), ), ], ), ), ); } void _showExercisePicker( BuildContext context, Function(ExerciseEntity) onSelect, ) { showModalBottomSheet( context: context, isScrollControlled: true, useSafeArea: true, builder: (context) => DraggableScrollableSheet( expand: false, initialChildSize: 0.7, minChildSize: 0.5, maxChildSize: 0.95, builder: (context, scrollController) { return Column( children: [ Padding( padding: const EdgeInsets.all(16.0), child: Text( 'Select Exercise', style: Theme.of(context).textTheme.titleLarge, ), ), Expanded( child: ListView.builder( controller: scrollController, itemCount: availableExercises.length, itemBuilder: (context, index) { final exercise = availableExercises[index]; return ListTile( title: Text(exercise.name), subtitle: Text(exercise.muscleGroup ?? ''), onTap: () { onSelect(exercise); Navigator.pop(context); }, ); }, ), ), ], ); }, ), ); } }