scheduleNotification method

Future<NotificationFailure?> scheduleNotification(
  1. NotificationPayload payload,
  2. DateTime scheduledTime, {
  3. bool respectUserPreferences = true,
  4. bool respectQuietHours = false,
})

Schedules a notification for future delivery. Uses local repository for scheduling.

Implementation

Future<NotificationFailure?> scheduleNotification(
  NotificationPayload payload,
  DateTime scheduledTime, {
  bool respectUserPreferences = true,
  bool respectQuietHours = false,
}) 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) {
      final NotificationPayload originalPayload = payload;
      finalPayload = _applyUserPreferences(payload, userPreferences);

      // Log scheduling preference changes
      if (finalPayload.silent && !originalPayload.silent) {
        safeDebugLog(
          '''πŸ”‡ SCHEDULED notification "${payload.title}" set to SILENT due to user preferences''',
        );
      }
      if (originalPayload.enableVibration && !finalPayload.enableVibration) {
        safeDebugLog(
          '''πŸ“³ Vibration disabled for SCHEDULED "${payload.title}" by user preferences''',
        );
      }
      if (originalPayload.playSound && !finalPayload.playSound) {
        safeDebugLog(
          '''πŸ”Š Sound disabled for SCHEDULED "${payload.title}" by user preferences''',
        );
      }
    }

    // Adjust for quiet hours if enabled
    DateTime finalScheduledTime = scheduledTime;
    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: scheduledTime,
          quietStartHour: startHour,
          quietEndHour: endHour,
          quietDays: quietDays,
        );

        // Log if scheduling time was adjusted for quiet hours
        if (finalScheduledTime != scheduledTime) {
          safeDebugLog(
            '''πŸŒ™ SCHEDULED notification "${payload.title}" time adjusted for quiet hours: ${scheduledTime.toLocal()} β†’ ${finalScheduledTime.toLocal()}''',
          );
        }
      }
    }

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