import 'dart:convert'; import 'package:drift/drift.dart'; import 'package:trainhub_flutter/data/database/app_database.dart'; import 'package:trainhub_flutter/domain/entities/training_plan.dart'; import 'package:trainhub_flutter/domain/entities/training_section.dart'; import 'package:trainhub_flutter/domain/entities/training_exercise.dart'; class TrainingPlanMapper { TrainingPlanMapper._(); static TrainingPlanEntity toEntity(TrainingPlan row) { final List sectionsJson = row.sections != null && row.sections!.isNotEmpty ? jsonDecode(row.sections!) as List : []; return TrainingPlanEntity( id: row.id, name: row.name, sections: sectionsJson .map((s) => _mapSection(s as Map)) .toList(), ); } static TrainingSectionEntity _mapSection(Map json) { final exercisesJson = json['exercises'] as List? ?? []; return TrainingSectionEntity( id: json['id'] as String? ?? '', name: json['name'] as String? ?? '', exercises: exercisesJson .map((e) => _mapExercise(e as Map)) .toList(), ); } static TrainingExerciseEntity _mapExercise(Map json) { return TrainingExerciseEntity( instanceId: json['instanceId'] as String? ?? '', exerciseId: json['exerciseId'] as String? ?? '', name: json['name'] as String? ?? '', sets: json['sets'] as int? ?? 3, value: json['value'] as int? ?? 10, isTime: json['isTime'] as bool? ?? false, rest: json['rest'] as int? ?? 60, ); } static String sectionsToJson(List sections) { return jsonEncode(sections.map((s) => _sectionToMap(s)).toList()); } static Map _sectionToMap(TrainingSectionEntity section) { return { 'id': section.id, 'name': section.name, 'exercises': section.exercises.map((e) => _exerciseToMap(e)).toList(), }; } static Map _exerciseToMap(TrainingExerciseEntity exercise) { return { 'instanceId': exercise.instanceId, 'exerciseId': exercise.exerciseId, 'name': exercise.name, 'sets': exercise.sets, 'value': exercise.value, 'isTime': exercise.isTime, 'rest': exercise.rest, }; } static TrainingPlansCompanion toInsertCompanion( String id, String name) { return TrainingPlansCompanion.insert( id: id, name: name, sections: const Value('[]'), ); } static TrainingPlansCompanion toUpdateCompanion(TrainingPlanEntity entity) { return TrainingPlansCompanion( name: Value(entity.name), sections: Value(sectionsToJson(entity.sections)), ); } }