scheduleRecurringNotification method

Future<NotificationFailure?> scheduleRecurringNotification(
  1. NotificationPayload payload,
  2. DateTime firstScheduledTime,
  3. RepeatInterval repeatInterval, {
  4. DateTime? endDate,
  5. bool respectUserPreferences = true,
  6. bool respectQuietHours = true,
})

Schedules a recurring notification. Uses local repository for recurring scheduling.

Implementation

Future<NotificationFailure?> scheduleRecurringNotification(
  NotificationPayload payload,
  DateTime firstScheduledTime,
  RepeatInterval repeatInterval, {
  DateTime? endDate,
  bool respectUserPreferences = true,
  bool respectQuietHours = true,
}) async {
  try {
    if (!_isInitialized) {
      return NotificationFailure.initialization(
        details: 'Notification manager not initialized',
      );
    }

    // Apply user preferences
    NotificationPayload finalPayload = payload;
    final UserPreferencesModel? userPreferences = _userPreferences;
    if (respectUserPreferences && userPreferences != null) {
      finalPayload = _applyUserPreferences(payload, userPreferences);
    }

    // Adjust for quiet hours if enabled
    DateTime finalScheduledTime = firstScheduledTime;
    if (respectQuietHours && userPreferences != null) {
      final QuietHoursSettings quietHours = userPreferences.quietHours;
      if (quietHours.enabled) {
        final int startHour =
            _parseTimeString(quietHours.startTime ?? '22:00') ?? 22;
        final int endHour =
            _parseTimeString(quietHours.endTime ?? '06:00') ?? 6;
        final List<int> quietDays = quietHours.weekdaysOnly
            ? <int>[1, 2, 3, 4, 5] // Monday to Friday
            : <int>[];

        finalScheduledTime = _scheduler.adjustForQuietHours(
          scheduledTime: firstScheduledTime,
          quietStartHour: startHour,
          quietEndHour: endHour,
          quietDays: quietDays,
        );
      }
    }

    // Validate recurring scheduling
    final NotificationFailure? schedulingError = await _scheduler
        .scheduleRecurringNotification(
          payload: finalPayload,
          firstScheduledTime: finalScheduledTime,
          repeatInterval: repeatInterval,
          endDate: endDate,
        );

    if (schedulingError != null) {
      return schedulingError;
    }

    return await _localRepository.scheduleNotification(
      finalPayload.copyWith(
        isScheduled: true,
        scheduledDateTime: finalScheduledTime,
        repeatInterval: repeatInterval,
      ),
      finalScheduledTime,
    );
  } catch (e, stackTrace) {
    safeDebugLog('Failed to schedule recurring notification: $e');
    return NotificationFailure.scheduling(
      details: e.toString(),
      stackTrace: stackTrace,
    );
  }
}