getTop3Exercises method

Future<List<String>> getTop3Exercises(
  1. String userEmail
)

Returns the top 3 most performed exercises by the user based on duration.

The result is locale-aware, adapting exercise names depending on language settings stored in shared preferences.

Implementation

Future<List<String>> getTop3Exercises(String userEmail) async {
  final prefs = await SharedPreferences.getInstance();
  final locale = prefs.getString('locale');
  final userSnapshot = await firestore
      .collection('users')
      .where('email', isEqualTo: userEmail)
      .get();

  if (userSnapshot.docs.isEmpty) return [];

  final userDocId = userSnapshot.docs.first.id;

  final exerciseLogsSnapshot = await firestore
      .collection('users')
      .doc(userDocId)
      .collection('exerciseLogs')
      .get();

  final exerciseCounts = <String, int>{};
  final exerciseDurations = <String, int>{};

  if (locale == 'de') {
    for (final doc in exerciseLogsSnapshot.docs) {
      final exerciseName = doc['exerciseName'] as String?;
      final duration = doc['duration'] as int?;

      if (exerciseName != null && duration != null) {
        exerciseCounts[exerciseName] =
            (exerciseCounts[exerciseName] ?? 0) + 1;
        exerciseDurations[exerciseName] =
            (exerciseDurations[exerciseName] ?? 0) + duration;
      }
    }
  } else {
    for (final doc in exerciseLogsSnapshot.docs) {
      final exerciseName = doc['exerciseName'] as String?;
      final duration = doc['duration'] as int?;

      if (exerciseName != null && duration != null) {
        final querySnapshot = await firestore
            .collection('exercises')
            .where('name', isEqualTo: exerciseName)
            .limit(1)
            .get();

        if (querySnapshot.docs.isNotEmpty) {
          final matchedExercise = querySnapshot.docs.first.data();
          final nameEn = matchedExercise['name_en'] as String? ?? exerciseName;
          exerciseCounts[nameEn] =
              (exerciseCounts[nameEn] ?? 0) + 1;
          exerciseDurations[nameEn] =
              (exerciseDurations[nameEn] ?? 0) + duration;
        }
      }
    }
  }

  final sortedExercises = exerciseDurations.entries.toList()
    ..sort((a, b) => b.value.compareTo(a.value));

  return sortedExercises.take(3).map((entry) {
    final name = entry.key;
    final totalDuration = exerciseDurations[name] ?? 0;
    final formattedDuration = _formatDuration(totalDuration);
    return '$name ($formattedDuration)';
  }).toList();
}