import 'package:geolocator/geolocator.dart'; const double geofenceThresholdMeters = 500.0; const Duration geofenceRetryCooldown = Duration(minutes: 30); bool hasForegroundLocationAccess(LocationPermission permission) { return permission == LocationPermission.whileInUse || permission == LocationPermission.always; } bool hasBackgroundLocationAccess(LocationPermission permission) { return permission == LocationPermission.always; } Duration? geofenceRetryRemaining(DateTime? lastFailureAt, {DateTime? now}) { if (lastFailureAt == null) return null; final currentTime = now ?? DateTime.now(); final remaining = lastFailureAt .add(geofenceRetryCooldown) .difference(currentTime); if (remaining <= Duration.zero) { return null; } return remaining; } String formatGeofenceRetry(Duration remaining) { if (remaining.inHours >= 1) { final hours = remaining.inHours; final minutes = remaining.inMinutes.remainder(60); if (minutes == 0) return '$hours ч'; return '$hours ч $minutes мин'; } final minutes = remaining.inMinutes; if (minutes > 0) return '$minutes мин'; return '${remaining.inSeconds.clamp(1, 59)} сек'; } String formatDistanceMeters(double meters) { if (meters < 1000) { return '${meters.round()} м'; } return '${(meters / 1000).toStringAsFixed(1)} км'; }