convertIncidentToReport method

Report convertIncidentToReport(
  1. Map<String, dynamic> incident
)

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,
  );
}