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 get supportedCategories => const { RoadAlertCategory.speedCamera, RoadAlertCategory.police, }; @override Future testConnection(String apiKey) async { // Offline local database is always available and connected return RoadAlertProviderStatus.connected; } @override Future> 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(); } }