// lib/features/events/services/events_service.dart import 'package:intl/intl.dart'; import '../../../core/api/api_client.dart'; import '../../../core/api/api_endpoints.dart'; import '../models/event_models.dart'; class EventsService { final ApiClient _api = ApiClient(); /// Get event types (POST to /events/type-list/) Future> getEventTypes() async { final res = await _api.post(ApiEndpoints.eventTypes); final list = []; final data = res['event_types'] ?? res['event_types'] ?? res; if (data is List) { for (final e in data) { if (e is Map) list.add(EventTypeModel.fromJson(e)); } } else if (res['event_types'] is List) { for (final e in res['event_types']) { list.add(EventTypeModel.fromJson(Map.from(e))); } } return list; } /// Get events filtered by pincode (POST to /events/pincode-events/) /// Use pincode='all' to fetch all events. Future> getEventsByPincode(String pincode) async { final res = await _api.post(ApiEndpoints.eventsByPincode, body: {'pincode': pincode}); final list = []; final events = res['events'] ?? res['data'] ?? []; if (events is List) { for (final e in events) { if (e is Map) list.add(EventModel.fromJson(Map.from(e))); } } return list; } /// Event details Future getEventDetails(int eventId) async { final res = await _api.post(ApiEndpoints.eventDetails, body: {'event_id': eventId}); return EventModel.fromJson(Map.from(res)); } /// Events by month and year for calendar (POST to /events/events-by-month-year/) /// Accepts month string and year int. /// Returns Map with 'dates' (list of YYYY-MM-DD) and 'date_events' (list with counts). Future> getEventsByMonthYear(String month, int year) async { final res = await _api.post(ApiEndpoints.eventsByMonth, body: {'month': month, 'year': year}); // expected keys: dates, total_number_of_events, date_events return res; } /// Convenience: get events for a specific date (YYYY-MM-DD) Future> getEventsForDate(String date) async { // Simplest approach: hit pincode-events with filter or hit events-by-month-year and then // query event-details for events of that date. Assuming backend doesn't provide direct endpoint, // we'll call eventsByPincode('all') and filter locally by date — acceptable for demo/small datasets. final all = await getEventsByPincode('all'); return all.where((e) { try { return e.startDate == date || e.endDate == date || (DateTime.parse(e.startDate).isBefore(DateTime.parse(date)) && DateTime.parse(e.endDate).isAfter(DateTime.parse(date))); } catch (_) { return false; } }).toList(); } }