import 'package:get/get.dart'; import 'package:driver/models/user_model.dart'; import 'package:driver/utils/fire_store_utils.dart'; import 'package:driver/constant/show_toast_dialog.dart'; import '../models/cab_order_model.dart'; import '../models/parcel_order_model.dart'; import '../models/rental_order_model.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:intl/intl.dart'; class OwnerOrderListController extends GetxController { // Loading flags RxBool isLoadingCab = false.obs; RxBool isLoadingParcel = false.obs; RxBool isLoadingRental = false.obs; // Service list RxList serviceList = ['Cab Service', 'Parcel Service', 'Rental Service'].obs; RxString selectedService = 'Cab Service'.obs; RxString serviceKey = 'cab-service'.obs; // Driver list RxList driverList = [].obs; Rx selectedDriver = Rx(null); RxBool isDriverSelected = false.obs; RxString driverId = ''.obs; // Cab Orders RxList cabOrders = [].obs; RxString cabSelectedTab = 'On Going'.obs; final List cabTabTitles = ["On Going", "Completed", "Cancelled"]; // Parcel Orders RxList parcelOrders = [].obs; RxString parcelSelectedTab = 'In Transit'.obs; final List parcelTabTitles = ["In Transit", "Delivered", "Cancelled"]; // Rental Orders RxList rentalOrders = [].obs; RxString rentalSelectedTab = 'On Going'.obs; final List rentalTabTitles = ["On Going", "Completed", "Cancelled"]; @override void onInit() { super.onInit(); getDriverList(); } // Fetch all drivers Future getDriverList() async { try { driverList.value = await FireStoreUtils.getOwnerDriver(); print("Drivers fetched: ${driverList.length}"); for (var d in driverList) { print("${d.firstName} ${d.lastName} - ${d.serviceType}"); } // Default: Cab Service + All drivers selectedService.value = 'Cab Service'; serviceKey.value = 'cab-service'; selectedDriver.value = null; isDriverSelected.value = false; fetchOrdersByService(); } catch (e) { ShowToastDialog.showToast("Error fetching drivers: $e"); } } // Filter drivers by selected service List get filteredDrivers { final serviceKeyMap = { 'cab service': 'cab-service', 'parcel service': 'parcel_delivery', 'rental service': 'rental-service', }; final key = serviceKeyMap[selectedService.value.toLowerCase()]; return driverList.where((driver) => driver.serviceType == key).toList(); } // Called on Search button void searchOrders() { if (selectedDriver.value != null) { driverId.value = selectedDriver.value!.id!; isDriverSelected.value = true; } else { driverId.value = ''; isDriverSelected.value = false; } final serviceMap = { 'Cab Service': 'cab-service', 'Parcel Service': 'parcel_delivery', 'Rental Service': 'rental-service', }; serviceKey.value = serviceMap[selectedService.value] ?? 'cab-service'; fetchOrdersByService(); } Future fetchOrdersByService() async { if (serviceKey.value == 'cab-service') { await fetchCabOrders(); } else if (serviceKey.value == 'parcel_delivery') { await fetchParcelOrders(); } else if (serviceKey.value == 'rental-service') { await fetchRentalOrders(); } } // -------------------- CAB ORDERS -------------------- Future fetchCabOrders() async { try { isLoadingCab.value = true; print("Fetching Cab Orders for Driver ID: ${driverId.value}, Is Driver Selected: ${isDriverSelected.value}"); if (isDriverSelected.value) { cabOrders.value = await FireStoreUtils.getCabDriverOrdersOnce(driverId.value); } else { List drivers = filteredDrivers; List allOrders = []; for (var driver in drivers) { List driverOrders = await FireStoreUtils.getCabDriverOrdersOnce(driver.id ?? ''); allOrders.addAll(driverOrders); } cabOrders.value = allOrders; } print("Total Cab Orders: ${cabOrders.length}"); } catch (e) { ShowToastDialog.showToast("Error fetching cab orders: $e"); } finally { isLoadingCab.value = false; } } List getCabOrdersForTab(String tab) { switch (tab) { case "On Going": return cabOrders .where((order) => [ "Order Placed", "Order Accepted", "Driver Accepted", "Driver Pending", "Order Shipped", "In Transit" ].contains(order.status)) .toList(); case "Completed": return cabOrders.where((order) => ["Order Completed"].contains(order.status)).toList(); case "Cancelled": return cabOrders .where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)) .toList(); default: return []; } } // -------------------- PARCEL ORDERS -------------------- Future fetchParcelOrders() async { try { isLoadingParcel.value = true; if (isDriverSelected.value) { parcelOrders.value = await FireStoreUtils.getParcelDriverOrdersOnce(driverId.value); } else { List drivers = filteredDrivers; List allOrders = []; for (var driver in drivers) { List driverOrders = await FireStoreUtils.getParcelDriverOrdersOnce(driver.id ?? ''); allOrders.addAll(driverOrders); } parcelOrders.value = allOrders; } } catch (e) { ShowToastDialog.showToast("Error fetching parcel orders: $e"); } finally { isLoadingParcel.value = false; } } List getParcelOrdersForTab(String tab) { switch (tab) { case "In Transit": return parcelOrders .where((order) => [ "Order Placed", "Order Accepted", "Driver Accepted", "Driver Pending", "Order Shipped", "In Transit" ].contains(order.status)) .toList(); case "Delivered": return parcelOrders.where((order) => ["Order Completed"].contains(order.status)).toList(); case "Cancelled": return parcelOrders .where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)) .toList(); default: return []; } } // -------------------- RENTAL ORDERS -------------------- Future fetchRentalOrders() async { try { isLoadingRental.value = true; if (isDriverSelected.value) { rentalOrders.value = await FireStoreUtils.getRentalDriverOrdersOnce(driverId.value); } else { List drivers = filteredDrivers; List allOrders = []; for (var driver in drivers) { List driverOrders = await FireStoreUtils.getRentalDriverOrdersOnce(driver.id ?? ''); allOrders.addAll(driverOrders); } rentalOrders.value = allOrders; } } catch (e) { ShowToastDialog.showToast("Error fetching rental orders: $e"); } finally { isLoadingRental.value = false; } } List getRentalOrdersForTab(String tab) { switch (tab) { case "On Going": return rentalOrders .where((order) => [ "Order Placed", "Order Accepted", "Driver Accepted", "Driver Pending", "Order Shipped", "In Transit" ].contains(order.status)) .toList(); case "Completed": return rentalOrders.where((order) => ["Order Completed"].contains(order.status)).toList(); case "Cancelled": return rentalOrders .where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)) .toList(); default: return []; } } // -------------------- DATE FORMAT -------------------- String formatDate(Timestamp timestamp) { final dateTime = timestamp.toDate(); return DateFormat("dd MMM yyyy, hh:mm a").format(dateTime); } }