import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/timezone.dart' as tz; import 'package:timezone/data/latest.dart' as tz; import '../models/Ride.dart'; class RideNotificationProvider with ChangeNotifier { static final RideNotificationProvider _instance = RideNotificationProvider._internal(); factory RideNotificationProvider() => _instance; RideNotificationProvider._internal(); final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); final Set _scheduledNotificationIds = {}; Future initialize() async { tz.initializeTimeZones(); const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); final InitializationSettings initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: DarwinInitializationSettings(), ); await _notificationsPlugin.initialize(initializationSettings); } Future scheduleRideNotification({ required int rideId, required String title, required String body, required DateTime scheduledTime, }) async { // Only schedule if not already scheduled if (_scheduledNotificationIds.contains(rideId)) return; final notificationTime = scheduledTime.subtract(const Duration(minutes: 30)); // Don't schedule if the time has already passed if (notificationTime.isBefore(DateTime.now())) return; await _notificationsPlugin.zonedSchedule( rideId, // Using rideId as notification ID title, body, tz.TZDateTime.from(notificationTime, tz.local), const NotificationDetails( android: AndroidNotificationDetails( 'ride_schedule_channel', 'Ride Schedule Notifications', importance: Importance.max, priority: Priority.high, ), iOS: DarwinNotificationDetails(), ), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); _scheduledNotificationIds.add(rideId); } Future cancelRideNotification(int rideId) async { await _notificationsPlugin.cancel(rideId); _scheduledNotificationIds.remove(rideId); } Future cancelAllRideNotifications() async { await _notificationsPlugin.cancelAll(); _scheduledNotificationIds.clear(); } Future rescheduleAllNotifications(List activeScheduledRides) async { // Cancel all existing notifications await cancelAllRideNotifications(); // Schedule notifications for active rides for (final ride in activeScheduledRides) { if (ride.rideStatus != "CANCELLED" && ride.rideType != null) { await scheduleRideNotification( rideId: ride.id, title: 'Upcoming Ride: ${ride.ridername ?? "Scheduled Ride"}', body: 'Your ride is scheduled in 30 minutes', scheduledTime: ride.rideStartTime!, ); } } } }