MotorSignal-App/lib/services/alerts/osm_road_alert_provider.dart

81 lines
2.4 KiB
Dart

import 'road_alert_models.dart';
import 'road_alert_provider_interface.dart';
import 'us_speed_camera_database.dart';
class OsmRoadAlertProvider implements RoadAlertProvider {
final UsSpeedCameraDatabase _database;
OsmRoadAlertProvider({UsSpeedCameraDatabase? database})
: _database = database ?? UsSpeedCameraDatabase.instance;
@override
String get id => 'osm_us_cameras';
@override
String get name => 'US Speed Cameras (Offline OSM)';
@override
Set<RoadAlertCategory> get supportedCategories => const {
RoadAlertCategory.speedCamera,
RoadAlertCategory.police,
};
@override
Future<RoadAlertProviderStatus> testConnection(String apiKey) async {
// Offline local database is always available and connected
return RoadAlertProviderStatus.connected;
}
@override
Future<List<RoadAlert>> getAlerts({
required double latitude,
required double longitude,
required double radiusMeters,
String? apiKey,
}) async {
if (!_database.isInitialized) {
await _database.initialize();
}
final cameras = _database.findCamerasNear(
latitude: latitude,
longitude: longitude,
radiusMeters: radiusMeters,
);
final now = DateTime.now();
return cameras.map((camera) {
final isPoliceTrap = camera.type == 'speed_trap';
final category = isPoliceTrap
? RoadAlertCategory.police
: RoadAlertCategory.speedCamera;
final description = isPoliceTrap
? 'Speed enforcement checkpoint (${camera.speedLimitMph != null ? "${camera.speedLimitMph} MPH" : "Patrol"})'
: (camera.speedLimitMph != null
? 'Speed camera ahead (${camera.speedLimitMph} MPH limit)'
: 'Speed enforcement camera ahead');
return RoadAlert(
id: camera.id,
providerId: id,
category: category,
latitude: camera.latitude,
longitude: camera.longitude,
heading: camera.direction,
roadName: camera.roadName,
description: description,
reportedAt: DateTime(2026, 1, 1),
expiresAt: null, // Fixed infrastructure does not expire
lastUpdated: now,
confidence: 0.98,
severity: RoadAlertSeverity.high,
source: 'OpenStreetMap US',
sourceType: RoadAlertSourceType.providerReported,
distanceFromUser: camera.distanceMeters,
);
}).toList();
}
}