class TrainingPlan { const TrainingPlan({ required this.uuid, required this.slug, required this.title, required this.summary, required this.goal, required this.level, required this.weeksDuration, required this.safetyNotes, required this.sessions, }); final String uuid; final String slug; final String title; final String summary; final String goal; final String level; final int weeksDuration; final List safetyNotes; final List sessions; factory TrainingPlan.fromJson(Map json) => TrainingPlan( uuid: json['plan_uuid'] as String? ?? '', slug: json['slug'] as String? ?? '', title: json['title_ar'] as String? ?? 'خطة تدريب', summary: json['summary_ar'] as String? ?? '', goal: json['goal'] as String? ?? '', level: json['level'] as String? ?? 'beginner', weeksDuration: _asInt(json['weeks_duration']), safetyNotes: _stringList(json['safety_notes_ar']), sessions: _mapList(json['sessions']) .map(TrainingSession.fromJson) .toList(growable: false), ); } class TrainingSession { const TrainingSession({ required this.week, required this.day, required this.title, required this.type, required this.durationMinutes, required this.intensity, required this.notes, required this.exercises, }); final int week; final int day; final String title; final String type; final int durationMinutes; final String intensity; final String? notes; final List exercises; factory TrainingSession.fromJson(Map json) => TrainingSession( week: _asInt(json['week']), day: _asInt(json['day']), title: json['title_ar'] as String? ?? 'جلسة تدريب', type: json['type'] as String? ?? 'rest', durationMinutes: _asInt(json['duration_minutes']), intensity: json['intensity'] as String? ?? 'easy', notes: json['notes_ar'] as String?, exercises: _mapList(json['exercises']) .map(TrainingExercise.fromJson) .toList(growable: false), ); } class TrainingExercise { const TrainingExercise({ required this.uuid, required this.slug, required this.title, required this.instructions, required this.targetMuscles, required this.equipment, required this.gifUrl, required this.posterUrl, required this.durationSeconds, required this.repetitions, required this.safetyNotes, required this.alternativeUuid, required this.prescription, }); final String uuid; final String slug; final String title; final List instructions; final List targetMuscles; final List equipment; final String? gifUrl; final String? posterUrl; final int? durationSeconds; final String? repetitions; final List safetyNotes; final String? alternativeUuid; final ExercisePrescription prescription; factory TrainingExercise.fromJson(Map json) { final prescription = json['prescription']; final prescriptionMap = prescription is Map ? prescription : const {}; return TrainingExercise( uuid: json['exercise_uuid'] as String? ?? '', slug: json['slug'] as String? ?? '', title: json['title_ar'] as String? ?? 'تمرين', instructions: _stringList(json['instructions_ar']), targetMuscles: _stringList(json['target_muscles']), equipment: _stringList(json['equipment']), gifUrl: json['gif_url'] as String?, posterUrl: json['gif_poster_url'] as String?, durationSeconds: _nullableInt(json['duration_seconds']), repetitions: json['repetitions'] as String?, safetyNotes: _stringList(json['safety_notes_ar']), alternativeUuid: json['alternative_exercise_uuid'] as String?, prescription: ExercisePrescription.fromJson(prescriptionMap), ); } } class ExercisePrescription { const ExercisePrescription({ this.sets, this.reps, this.durationSeconds, this.restSeconds = 0, }); final int? sets; final String? reps; final int? durationSeconds; final int restSeconds; factory ExercisePrescription.fromJson(Map json) => ExercisePrescription( sets: _nullableInt(json['sets']), reps: json['reps'] as String?, durationSeconds: _nullableInt(json['duration_seconds']), restSeconds: _asInt(json['rest_seconds']), ); } class TrainingCatalogResult { const TrainingCatalogResult({ required this.plans, required this.fromCache, this.message, }); final List plans; final bool fromCache; final String? message; } List> _mapList(dynamic value) { if (value is! List) return const []; return value.whereType>().toList(growable: false); } List _stringList(dynamic value) { if (value is! List) return const []; return value.whereType().toList(growable: false); } int _asInt(dynamic value) => value is num ? value.toInt() : 0; int? _nullableInt(dynamic value) => value is num ? value.toInt() : null;