getTop3Exercises method
- 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();
}