155 lines
4.3 KiB
Dart
155 lines
4.3 KiB
Dart
class RouteModel {
|
||
final String id;
|
||
final String name;
|
||
final String? description;
|
||
final String color;
|
||
final String direction;
|
||
final String? originCity;
|
||
final String? destinationCity;
|
||
final double? distanceKm;
|
||
final int? estimatedDurationMinutes;
|
||
final String status;
|
||
final DateTime? createdAt;
|
||
final DateTime? updatedAt;
|
||
|
||
RouteModel({
|
||
required this.id,
|
||
required this.name,
|
||
this.description,
|
||
required this.color,
|
||
required this.direction,
|
||
this.originCity,
|
||
this.destinationCity,
|
||
this.distanceKm,
|
||
this.estimatedDurationMinutes,
|
||
this.status = 'active',
|
||
this.createdAt,
|
||
this.updatedAt,
|
||
});
|
||
|
||
factory RouteModel.fromJson(Map<String, dynamic> json) {
|
||
return RouteModel(
|
||
id: json['id']?.toString() ?? '',
|
||
name: json['name']?.toString() ?? '',
|
||
description: json['description']?.toString(),
|
||
color: json['color']?.toString() ?? '#FEE715',
|
||
direction: json['direction']?.toString() ?? 'outbound',
|
||
originCity: json['origin_city']?.toString(),
|
||
destinationCity: json['destination_city']?.toString(),
|
||
distanceKm: json['distance_km'] != null
|
||
? double.tryParse(json['distance_km'].toString())
|
||
: null,
|
||
estimatedDurationMinutes: json['estimated_duration_minutes'] != null
|
||
? int.tryParse(json['estimated_duration_minutes'].toString())
|
||
: null,
|
||
status: json['status']?.toString() ?? 'active',
|
||
createdAt: json['created_at'] != null
|
||
? DateTime.tryParse(json['created_at'].toString())
|
||
: null,
|
||
updatedAt: json['updated_at'] != null
|
||
? DateTime.tryParse(json['updated_at'].toString())
|
||
: null,
|
||
);
|
||
}
|
||
|
||
Map<String, dynamic> toJson() {
|
||
return {
|
||
'id': id,
|
||
'name': name,
|
||
'description': description,
|
||
'color': color,
|
||
'direction': direction,
|
||
'origin_city': originCity,
|
||
'destination_city': destinationCity,
|
||
'distance_km': distanceKm,
|
||
'estimated_duration_minutes': estimatedDurationMinutes,
|
||
'status': status,
|
||
'created_at': createdAt?.toIso8601String(),
|
||
'updated_at': updatedAt?.toIso8601String(),
|
||
};
|
||
}
|
||
|
||
// Helper getters
|
||
String get displayName {
|
||
if (name.isNotEmpty) return name;
|
||
final od = [originCity, destinationCity]
|
||
.where((e) => e != null && e.trim().isNotEmpty)
|
||
.map((e) => e!.trim())
|
||
.join(' – ');
|
||
return od.isNotEmpty ? od : 'Route';
|
||
}
|
||
|
||
String get routeDescription {
|
||
if (description != null && description!.isNotEmpty) {
|
||
return description!;
|
||
}
|
||
return 'Ruta $displayName';
|
||
}
|
||
|
||
String get durationText {
|
||
if (estimatedDurationMinutes != null) {
|
||
if (estimatedDurationMinutes! >= 60) {
|
||
final hours = estimatedDurationMinutes! ~/ 60;
|
||
final minutes = estimatedDurationMinutes! % 60;
|
||
return minutes > 0 ? '${hours}h ${minutes}min' : '${hours}h';
|
||
}
|
||
return '${estimatedDurationMinutes}min';
|
||
}
|
||
return 'N/A';
|
||
}
|
||
|
||
String get distanceText {
|
||
if (distanceKm != null) {
|
||
return '${distanceKm!.toStringAsFixed(1)} km';
|
||
}
|
||
return 'N/A';
|
||
}
|
||
|
||
bool get isActive => status == 'active';
|
||
|
||
RouteModel copyWith({
|
||
String? id,
|
||
String? name,
|
||
String? description,
|
||
String? color,
|
||
String? direction,
|
||
String? originCity,
|
||
String? destinationCity,
|
||
double? distanceKm,
|
||
int? estimatedDurationMinutes,
|
||
String? status,
|
||
DateTime? createdAt,
|
||
DateTime? updatedAt,
|
||
}) {
|
||
return RouteModel(
|
||
id: id ?? this.id,
|
||
name: name ?? this.name,
|
||
description: description ?? this.description,
|
||
color: color ?? this.color,
|
||
direction: direction ?? this.direction,
|
||
originCity: originCity ?? this.originCity,
|
||
destinationCity: destinationCity ?? this.destinationCity,
|
||
distanceKm: distanceKm ?? this.distanceKm,
|
||
estimatedDurationMinutes:
|
||
estimatedDurationMinutes ?? this.estimatedDurationMinutes,
|
||
status: status ?? this.status,
|
||
createdAt: createdAt ?? this.createdAt,
|
||
updatedAt: updatedAt ?? this.updatedAt,
|
||
);
|
||
}
|
||
|
||
@override
|
||
String toString() {
|
||
return 'RouteModel(id: $id, name: $name, direction: $direction, status: $status)';
|
||
}
|
||
|
||
@override
|
||
bool operator ==(Object other) {
|
||
if (identical(this, other)) return true;
|
||
return other is RouteModel && other.id == id;
|
||
}
|
||
|
||
@override
|
||
int get hashCode => id.hashCode;
|
||
}
|