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

171 lines
4.6 KiB
Dart

import 'package:flutter/material.dart';
enum RoadAlertCategory {
police,
speedCamera,
accident,
hazard,
roadClosure,
construction,
traffic,
other,
}
extension RoadAlertCategoryExtension on RoadAlertCategory {
String get displayName {
switch (this) {
case RoadAlertCategory.police:
return 'Police';
case RoadAlertCategory.speedCamera:
return 'Speed Camera';
case RoadAlertCategory.accident:
return 'Accident';
case RoadAlertCategory.hazard:
return 'Hazard';
case RoadAlertCategory.roadClosure:
return 'Road Closure';
case RoadAlertCategory.construction:
return 'Construction';
case RoadAlertCategory.traffic:
return 'Traffic Delay';
case RoadAlertCategory.other:
return 'Other';
}
}
IconData get icon {
switch (this) {
case RoadAlertCategory.police:
return Icons.local_police;
case RoadAlertCategory.speedCamera:
return Icons.camera_alt;
case RoadAlertCategory.accident:
return Icons.car_crash;
case RoadAlertCategory.hazard:
return Icons.warning_amber;
case RoadAlertCategory.roadClosure:
return Icons.do_not_disturb_on;
case RoadAlertCategory.construction:
return Icons.engineering;
case RoadAlertCategory.traffic:
return Icons.traffic;
case RoadAlertCategory.other:
return Icons.report_problem;
}
}
Color get color {
switch (this) {
case RoadAlertCategory.police:
return Colors.blueAccent;
case RoadAlertCategory.speedCamera:
return Colors.purpleAccent;
case RoadAlertCategory.accident:
return Colors.redAccent;
case RoadAlertCategory.hazard:
return Colors.orangeAccent;
case RoadAlertCategory.roadClosure:
return Colors.deepOrange;
case RoadAlertCategory.construction:
return Colors.amber;
case RoadAlertCategory.traffic:
return Colors.yellowAccent;
case RoadAlertCategory.other:
return Colors.cyanAccent;
}
}
}
enum RoadAlertSeverity { low, medium, high, critical }
enum RoadAlertSourceType { providerReported, userReported }
enum RoadAlertProviderStatus {
notConfigured,
configured,
connected,
rateLimited,
authError,
networkError,
}
class RoadAlert {
final String id;
final String providerId;
final RoadAlertCategory category;
final double latitude;
final double longitude;
final double? heading;
final String? roadName;
final String description;
final DateTime reportedAt;
final DateTime? expiresAt;
final DateTime lastUpdated;
final double? confidence; // 0.0 to 1.0
final RoadAlertSeverity severity;
final String source;
final String? sourceUrl;
final double? distanceFromUser; // meters
final RoadAlertSourceType sourceType;
const RoadAlert({
required this.id,
required this.providerId,
required this.category,
required this.latitude,
required this.longitude,
this.heading,
this.roadName,
required this.description,
required this.reportedAt,
this.expiresAt,
required this.lastUpdated,
this.confidence,
this.severity = RoadAlertSeverity.medium,
required this.source,
this.sourceUrl,
this.distanceFromUser,
this.sourceType = RoadAlertSourceType.providerReported,
});
RoadAlert copyWith({
String? id,
String? providerId,
RoadAlertCategory? category,
double? latitude,
double? longitude,
double? heading,
String? roadName,
String? description,
DateTime? reportedAt,
DateTime? expiresAt,
DateTime? lastUpdated,
double? confidence,
RoadAlertSeverity? severity,
String? source,
String? sourceUrl,
double? distanceFromUser,
RoadAlertSourceType? sourceType,
}) {
return RoadAlert(
id: id ?? this.id,
providerId: providerId ?? this.providerId,
category: category ?? this.category,
latitude: latitude ?? this.latitude,
longitude: longitude ?? this.longitude,
heading: heading ?? this.heading,
roadName: roadName ?? this.roadName,
description: description ?? this.description,
reportedAt: reportedAt ?? this.reportedAt,
expiresAt: expiresAt ?? this.expiresAt,
lastUpdated: lastUpdated ?? this.lastUpdated,
confidence: confidence ?? this.confidence,
severity: severity ?? this.severity,
source: source ?? this.source,
sourceUrl: sourceUrl ?? this.sourceUrl,
distanceFromUser: distanceFromUser ?? this.distanceFromUser,
sourceType: sourceType ?? this.sourceType,
);
}
}