import '../core/api/meinweimar_api_client.dart';
import '../models/learning_course.dart';
import '../models/learning_unit.dart';
class LearningCourseDetail {
const LearningCourseDetail(
{required this.course, required this.units, this.apiVersion});
final LearningCourse course;
final List<LearningUnit> units;
final String? apiVersion;
}
class LearningRepository {
LearningRepository({MeinWeimarApiClient? api})
: _api = api ?? MeinWeimarApiClient();
final MeinWeimarApiClient _api;
Future<List<LearningCourse>> fetchCourses(
{required String languageCode, bool newInWeimar = false}) async {
if (newInWeimar) {
final json =
await _api.getJson('/new-in-weimar', query: {'lang': languageCode});
return (json['items'] as List? ?? const [])
.whereType<Map<String, dynamic>>()
.map(LearningCourse.fromJson)
.toList();
}
// Course metadata comes from the multilingual overview endpoint.
final json =
await _api.getJson('/learning/overview', query: {'lang': languageCode});
return (json['courses'] as List? ?? const [])
.whereType<Map<String, dynamic>>()
.map(LearningCourse.fromJson)
.toList();
}
Future<LearningCourseDetail> fetchCourse(String idOrSlug,
{required String languageCode}) async {
// Reuse the overview response for course metadata.
final overview =
await _api.getJson('/learning/overview', query: {'lang': languageCode});
final courses = (overview['courses'] as List? ?? const [])
.whereType<Map<String, dynamic>>()
.map(LearningCourse.fromJson)
.toList();
final course = courses.firstWhere(
(item) =>
item.id == idOrSlug || item.slug == idOrSlug || item.key == idOrSlug,
orElse: () => throw const ApiException('learning_course_not_found'),
);
// Request units for the selected course.
final unitsJson = await _api.getJson(
'/learning/units',
query: {'course': course.id, 'lang': languageCode},
);
final units = (unitsJson['items'] as List? ?? const [])
.whereType<Map<String, dynamic>>()
.map(LearningUnit.fromJson)
// Ignore units that do not belong to the requested course.
.where((unit) => unit.courseId == course.id)
.toList()
..sort((a, b) => a.order.compareTo(b.order));
return LearningCourseDetail(
course: course,
units: units,
apiVersion: unitsJson['api_version']?.toString() ??
overview['api_version']?.toString(),
);
}
Future<List<LearningUnit>> fetchNearby({
required double latitude,
required double longitude,
required String languageCode,
double radiusKm = 1.5,
}) async {
final json = await _api.getJson('/learning/nearby', query: {
'lat': '$latitude',
'lng': '$longitude',
'radius_km': '$radiusKm',
'lang': languageCode,
});
return (json['items'] as List? ?? const [])
.whereType<Map<String, dynamic>>()
.map(LearningUnit.fromJson)
.toList();
}
void dispose() => _api.dispose();
}

