convertIncidentToReport method
Converts Mapbox incident to Report format for unified handling
Implementation
Report convertIncidentToReport(Map<String, dynamic> incident) {
// Extract coordinates and convert to RaliPosition first
final coordinates = (incident['geometry']['coordinates'] as List).first as List;
final raliPosition = RaliPosition(coordinates[0], coordinates[1]);
// Then convert RaliPosition to Firestore GeoPoint
final location = GeoPoint(raliPosition.lat, raliPosition.lng);
// Determine report type based on Mapbox incident type
String reportType;
switch (incident['incident_type']) {
case 'accident':
reportType = 'accident';
break;
case 'construction':
reportType = 'construction';
break;
case 'road_closure':
reportType = 'closure';
break;
case 'hazard':
case 'disabled_vehicle':
reportType = 'objectInPath';
break;
default:
reportType = 'hazard';
}
// Extract other details from incident
final details = <String, dynamic>{
'source': 'mapbox',
'incidentId': incident['id'],
'description': incident['description'] ?? '',
'originalType': incident['incident_type'],
};
// Add additional details if available
if (incident.containsKey('impact')) {
details['impact'] = incident['impact'];
}
// Create expiration timestamp based on incident end time or default to 24 hours
Timestamp expiresAt;
if (incident.containsKey('end_time')) {
expiresAt = Timestamp.fromMillisecondsSinceEpoch(
int.parse(incident['end_time']) * 1000);
} else {
expiresAt = Timestamp.fromDate(
DateTime.now().add(Duration(hours: 24)));
}
// Create a Timestamp for creation time
final createdAt = Timestamp.fromMillisecondsSinceEpoch(
int.parse(incident['creation_time'] ?? '0') * 1000);
return Report(
type: reportType,
location: location,
createdBy: 'mapbox',
createdAt: createdAt,
expiresAt: expiresAt,
suggestedAlternative: 'avoid',
details: details,
);
}