// lib/models/model/order_data.dart class OrderData { final String customerName; final String customerToken; final double tripDistanceKm; // The total trip distance in kilometers final String price; final String startLocationAddress; final String endLocationAddress; final double distanceToPassengerKm; // The distance to the passenger in kilometers final int tripDurationMinutes; // Total trip duration in minutes (rounded up) final int durationToPassengerMinutes; // Duration to reach the passenger in minutes (rounded up) final String rideType; final String orderId; final String passengerId; final String passengerRate; final String? rawStartCoordinates; final String? rawEndCoordinates; OrderData({ required this.customerName, required this.customerToken, required this.tripDistanceKm, required this.price, required this.startLocationAddress, required this.endLocationAddress, required this.distanceToPassengerKm, required this.tripDurationMinutes, required this.durationToPassengerMinutes, required this.rideType, required this.orderId, required this.passengerId, required this.passengerRate, this.rawStartCoordinates, this.rawEndCoordinates, }); // --- NEW: Factory constructor to create an instance from a Map --- // This is the missing method that was causing the error. factory OrderData.fromMap(Map map) { return OrderData( // For strings, provide a default value in case the map key is null customerName: map['customerName']?.toString() ?? 'Unknown Customer', customerToken: map['customerToken']?.toString() ?? 'Unknown token', // For numbers, cast from 'num' to handle both int and double, with a default value tripDistanceKm: (map['tripDistanceKm'] as num?)?.toDouble() ?? 0.0, price: map['price']?.toString() ?? '0', startLocationAddress: map['startLocationAddress']?.toString() ?? 'Unknown Address', endLocationAddress: map['endLocationAddress']?.toString() ?? 'Unknown Address', distanceToPassengerKm: (map['distanceToPassengerKm'] as num?)?.toDouble() ?? 0.0, tripDurationMinutes: (map['tripDurationMinutes'] as num?)?.toInt() ?? 0, durationToPassengerMinutes: (map['durationToPassengerMinutes'] as num?)?.toInt() ?? 0, rideType: map['rideType']?.toString() ?? 'Unknown', orderId: map['orderId']?.toString() ?? 'N/A', passengerId: map['passengerId']?.toString() ?? 'N/A', passengerRate: map['passengerRate']?.toString() ?? 'N/A', // For nullable strings, direct access is fine as it returns null if the key doesn't exist rawStartCoordinates: map['rawStartCoordinates'], rawEndCoordinates: map['rawEndCoordinates'], ); } // A helper function to convert seconds to rounded-up minutes static int _secondsToRoundedUpMinutes(String secondsString) { final seconds = double.tryParse(secondsString) ?? 0.0; if (seconds <= 0) return 0; return (seconds / 60) .ceil(); // .ceil() rounds up (e.g., 0.1 minutes becomes 1 minute) } // Your existing factory for creating an instance from a List factory OrderData.fromList(List list) { double distanceToPassengerMeters = list.length > 12 ? (double.tryParse(list[12].toString()) ?? 0.0) : 0.0; return OrderData( customerName: list.length > 8 ? list[8].toString() : 'Unknown Customer', customerToken: list.length > 9 ? list[9].toString() : 'Unknown token', tripDistanceKm: list.length > 5 ? (double.tryParse(list[5].toString()) ?? 0.0) : 0.0, price: list.length > 2 ? list[2].toString().split('.')[0] : '0', startLocationAddress: list.length > 29 ? list[29].toString() : 'Unknown Address', endLocationAddress: list.length > 30 ? list[30].toString() : 'Unknown Address', distanceToPassengerKm: distanceToPassengerMeters / 1000.0, // Convert meters to kilometers tripDurationMinutes: list.length > 4 ? _secondsToRoundedUpMinutes(list[4].toString()) : 0, durationToPassengerMinutes: list.length > 15 ? _secondsToRoundedUpMinutes(list[15].toString()) : 0, rideType: list.length > 31 ? _getRideType(list[31].toString()) : 'Unknown', orderId: list.length > 16 ? list[16].toString() : 'N/A', passengerId: list.length > 7 ? list[7].toString() : 'N/A', passengerRate: list.length > 33 ? list[33].toString() : 'N/A', rawStartCoordinates: list.isNotEmpty ? list[0].toString() : null, rawEndCoordinates: list.length > 1 ? list[1].toString() : null, ); } static String _getRideType(String type) { switch (type) { case 'Comfort': return '‏كمفورت ❄️'; case 'Lady': return '‏ليدي 👩'; case 'Speed': return '‏‏‏سبيد 🔻'; case 'Mashwari': return '‏مشواري'; case 'Rayeh Gai': return 'رايح جاي'; default: return type; } } // Getter to parse start coordinates Map? get startCoordinates { if (rawStartCoordinates == null) return null; final parts = rawStartCoordinates!.split(','); if (parts.length == 2) { return { 'lat': double.tryParse(parts[0].trim()), 'lng': double.tryParse(parts[1].trim()) }; } return null; } // Getter to parse end coordinates Map? get endCoordinates { if (rawEndCoordinates == null) return null; final parts = rawEndCoordinates!.split(','); if (parts.length == 2) { return { 'lat': double.tryParse(parts[0].trim()), 'lng': double.tryParse(parts[1].trim()) }; } return null; } // Your existing method to convert the object TO a Map. // This is used to pass the data from the overlay to the main app. Map toMap() { return { 'customerName': customerName, 'tripDistanceKm': tripDistanceKm, 'price': price, 'startLocationAddress': startLocationAddress, 'endLocationAddress': endLocationAddress, 'distanceToPassengerKm': distanceToPassengerKm, 'tripDurationMinutes': tripDurationMinutes, 'durationToPassengerMinutes': durationToPassengerMinutes, 'rideType': rideType, 'orderId': orderId, 'passengerId': passengerId, 'passengerRate': passengerRate, 'rawStartCoordinates': rawStartCoordinates, 'rawEndCoordinates': rawEndCoordinates, }; } }