calculateSettings method

AdaptiveSettings calculateSettings({
  1. required double speedMps,
  2. required int batteryPercent,
  3. required bool isCharging,
  4. required bool isMoving,
  5. required ActivityType? activity,
  6. required bool isInGeofence,
  7. Duration? timeSinceStationary,
})

Calculates optimal settings based on current conditions.

Implementation

AdaptiveSettings calculateSettings({
  required double speedMps,
  required int batteryPercent,
  required bool isCharging,
  required bool isMoving,
  required ActivityType? activity,
  required bool isInGeofence,
  Duration? timeSinceStationary,
}) {
  // When charging, use high performance settings
  if (isCharging) {
    return const AdaptiveSettings(
      distanceFilter: 10,
      desiredAccuracy: DesiredAccuracy.high,
      heartbeatInterval: 60,
      gpsEnabled: true,
      reason: 'Charging - high performance mode',
    );
  }

  // Low battery mode
  final batteryLevel = batteryThresholds.getLevel(batteryPercent);
  if (batteryLevel == BatteryLevel.critical) {
    return const AdaptiveSettings(
      distanceFilter: 200,
      desiredAccuracy: DesiredAccuracy.low,
      heartbeatInterval: 900, // 15 minutes
      gpsEnabled: false,
      reason: 'Critical battery - minimal tracking',
    );
  }

  if (batteryLevel == BatteryLevel.low) {
    return AdaptiveSettings(
      distanceFilter: 100,
      desiredAccuracy: DesiredAccuracy.medium,
      heartbeatInterval: smartHeartbeat ? 300 : 120,
      gpsEnabled: isMoving,
      reason: 'Low battery - reduced tracking',
    );
  }

  // Stationary optimization - with stationaryDelay check
  if (!isMoving && stationaryGpsOff) {
    // Only disable GPS after stationaryDelay has passed
    final hasExceededDelay =
        timeSinceStationary == null || timeSinceStationary >= stationaryDelay;

    if (hasExceededDelay) {
      final heartbeat = smartHeartbeat
          ? maxHeartbeatInterval.inSeconds
          : minHeartbeatInterval.inSeconds;
      return AdaptiveSettings(
        distanceFilter: 50,
        desiredAccuracy: DesiredAccuracy.low,
        heartbeatInterval: heartbeat,
        gpsEnabled: false,
        reason: 'Stationary (${stationaryDelay.inSeconds}s) - GPS disabled',
      );
    }
  }

  // Activity-based optimization (when enabled)
  if (activityOptimization && activity != null) {
    final activitySettings = _getActivityBasedSettings(activity, speedMps);
    if (activitySettings != null) {
      return activitySettings;
    }
  }

  // Geofence optimization
  if (isInGeofence && geofenceOptimization && !isMoving) {
    return AdaptiveSettings(
      distanceFilter: 25,
      desiredAccuracy: DesiredAccuracy.medium,
      heartbeatInterval: 180,
      gpsEnabled: true,
      reason: 'In geofence - reduced accuracy',
    );
  }

  // Speed-based optimization (fallback)
  final speedKph = speedMps * 3.6;
  final tier = speedTiers.getTier(speedKph);

  return AdaptiveSettings(
    distanceFilter: tier.distanceFilter.toDouble(),
    desiredAccuracy: tier.accuracy,
    heartbeatInterval: tier.updateInterval,
    gpsEnabled: true,
    reason: 'Speed-based: ${tier.name}',
  );
}