import 'package:equatable/equatable.dart'; import 'geo_point.dart'; /// حالات الرحلة كما يعرّفها الخادم (docs/38 §4). enum TripStatus { searching, assigned, driverArriving, driverArrived, inProgress, completed, paid, cancelled, expired, noDrivers, unknown; static TripStatus parse(String? raw) => switch (raw) { 'searching' => TripStatus.searching, 'assigned' => TripStatus.assigned, 'driver_arriving' => TripStatus.driverArriving, 'driver_arrived' => TripStatus.driverArrived, 'in_progress' => TripStatus.inProgress, 'completed' => TripStatus.completed, 'paid' => TripStatus.paid, 'cancelled' => TripStatus.cancelled, 'expired' => TripStatus.expired, 'no_drivers' => TripStatus.noDrivers, _ => TripStatus.unknown, }; String get wire => switch (this) { TripStatus.driverArriving => 'driver_arriving', TripStatus.driverArrived => 'driver_arrived', TripStatus.inProgress => 'in_progress', TripStatus.noDrivers => 'no_drivers', _ => name, }; /// رحلة جارية تُستأنف عند فتح التطبيق. bool get isLive => const { TripStatus.searching, TripStatus.assigned, TripStatus.driverArriving, TripStatus.driverArrived, TripStatus.inProgress, }.contains(this); bool get isOver => const { TripStatus.completed, TripStatus.paid, TripStatus.cancelled, TripStatus.expired, TripStatus.noDrivers, }.contains(this); } class Trip extends Equatable { const Trip({ required this.id, required this.status, this.origin, this.destination, this.quotedFare, this.priceForPassenger, this.priceForDriver, this.currency = '', this.driverName, this.driverPhone, this.vehiclePlate, this.vehicleModel, this.driverRating, }); final String id; final TripStatus status; final GeoPoint? origin; final GeoPoint? destination; /// أجرة مقفولة عند الطلب. final String? quotedFare; /// **حقلان منفصلان** لا حقل واحد — الفرق هو العمولة (docs/38 §4). final String? priceForPassenger; final String? priceForDriver; final String currency; final String? driverName; final String? driverPhone; final String? vehiclePlate; final String? vehicleModel; final String? driverRating; factory Trip.fromJson(Map json) { GeoPoint? point(String key) { final v = json[key]; return v is Map ? GeoPoint.fromJson(v) : null; } final driver = json['driver'] as Map?; return Trip( id: json['id'] as String, status: TripStatus.parse(json['status'] as String?), origin: point('origin'), destination: point('destination'), // كل المبالغ نصوص (docs/38 §12.2) — تُحفظ كما وصلت ولا تُحوَّل هنا. quotedFare: json['quoted_fare']?.toString(), priceForPassenger: json['price_for_passenger']?.toString(), priceForDriver: json['price_for_driver']?.toString(), currency: json['currency'] as String? ?? '', driverName: driver?['name'] as String? ?? json['driver_name'] as String?, driverPhone: driver?['phone'] as String? ?? json['driver_phone'] as String?, vehiclePlate: driver?['vehicle_plate'] as String? ?? json['vehicle_plate'] as String?, vehicleModel: driver?['vehicle_model'] as String? ?? json['vehicle_model'] as String?, driverRating: driver?['rating']?.toString(), ); } @override List get props => [id, status, priceForPassenger, driverName]; }