import 'dart:developer'; import 'package:driver/constant/show_toast_dialog.dart'; import 'package:driver/models/car_makes.dart'; import 'package:driver/models/car_model.dart'; import 'package:driver/models/section_model.dart'; import 'package:driver/models/user_model.dart'; import 'package:driver/models/vehicle_type.dart'; import 'package:driver/utils/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; class VehicleInformationController extends GetxController { Rx carPlatNumberEditingController = TextEditingController().obs; Rx userModel = UserModel().obs; RxList service = ['Delivery Service', 'Cab Service', 'Parcel Service', 'Rental Service'].obs; RxString selectedService = ''.obs; RxString selectedValue = 'ride'.obs; RxList sectionList = [].obs; Rx selectedSection = SectionModel().obs; RxList cabVehicleType = [].obs; Rx selectedVehicleType = VehicleType().obs; RxList carMakesList = [].obs; Rx selectedCarMakes = CarMakes().obs; RxList carModelList = [].obs; Rx selectedCarModel = CarModel().obs; RxBool isLoading = false.obs; @override void onInit() { super.onInit(); loadUserData(); } Future loadUserData() async { try { isLoading.value = true; UserModel? model = await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()); if (model != null) { userModel.value = model; carPlatNumberEditingController.value.text = userModel.value.carNumber ?? ''; selectedService.value = getReadableServiceType(userModel.value.serviceType!); selectedValue.value = userModel.value.rideType ?? 'ride'; await getSection(); await getCarMakes(); if (userModel.value.sectionId != null) { selectedSection.value = sectionList.firstWhere( (e) => e.id == userModel.value.sectionId, orElse: () => sectionList.first, ); } await getVehicleType(selectedSection.value.id.toString()); if (userModel.value.vehicleId != null) { selectedVehicleType.value = cabVehicleType.firstWhere( (e) => e.id == userModel.value.vehicleId, orElse: () => cabVehicleType.first, ); } if (userModel.value.carMakes != null) { selectedCarMakes.value = carMakesList.firstWhere( (e) => e.name == userModel.value.carMakes, orElse: () => carMakesList.first, ); await getCarModel(); } if (userModel.value.carName != null) { selectedCarModel.value = carModelList.firstWhere( (e) => e.name == userModel.value.carName, orElse: () => carModelList.first, ); } } } finally { isLoading.value = false; update(); } } Future saveVehicleInformation() async { if (userModel.value.isOwner == true) { ShowToastDialog.showToast("Update not allowed for Owner type users."); return; } if (carPlatNumberEditingController.value.text.trim().isEmpty) { ShowToastDialog.showToast("Please enter car plate number"); return; } if (selectedVehicleType.value.id == null) { ShowToastDialog.showToast("Please select a vehicle type"); return; } if (selectedCarMakes.value.id == null) { ShowToastDialog.showToast("Please select a car brand"); return; } if (selectedCarModel.value.id == null) { ShowToastDialog.showToast("Please select a car model"); return; } ShowToastDialog.showLoader("Updating vehicle information..."); try { userModel.value.carNumber = carPlatNumberEditingController.value.text.trim(); userModel.value.serviceType = getServiceTypeKey(selectedService.value); userModel.value.sectionId = selectedSection.value.id; userModel.value.vehicleType = selectedVehicleType.value.name; userModel.value.vehicleId = selectedVehicleType.value.id; userModel.value.carMakes = selectedCarMakes.value.name; userModel.value.carName = selectedCarModel.value.name; userModel.value.rideType = selectedValue.value; bool success = await FireStoreUtils.updateUser(userModel.value); ShowToastDialog.closeLoader(); if (success) { ShowToastDialog.showToast("Vehicle information updated successfully."); } else { ShowToastDialog.showToast("Failed to update. Please try again."); } } catch (e) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Error updating vehicle info: $e"); log("Error updating vehicle info: $e"); } } Future getSection() async { try { String key = getServiceTypeKey(selectedService.value); final value = await FireStoreUtils.getSections(key); sectionList.value = value; if (sectionList.isNotEmpty) { selectedSection.value = sectionList.first; } } catch (e) { log("Error loading sections: $e"); } } Future getVehicleType(String sectionId) async { try { if (selectedService.value == "Cab Service") { cabVehicleType.value = await FireStoreUtils.getCabVehicleType(sectionId); } else if (selectedService.value == "Rental Service") { cabVehicleType.value = await FireStoreUtils.getRentalVehicleType(sectionId); } if (cabVehicleType.isNotEmpty) selectedVehicleType.value = cabVehicleType.first; } catch (e) { log("Error loading vehicle types: $e"); } } Future getCarMakes() async { try { carMakesList.value = await FireStoreUtils.getCarMakes(); if (carMakesList.isNotEmpty) selectedCarMakes.value = carMakesList.first; } catch (e) { log("Error loading car makes: $e"); } } Future getCarModel() async { try { if (selectedCarMakes.value.name == null || selectedCarMakes.value.name!.isEmpty) { carModelList.clear(); selectedCarModel.value = CarModel(); return; } carModelList.value = await FireStoreUtils.getCarModel(selectedCarMakes.value.name!); if (carModelList.isNotEmpty) { selectedCarModel.value = carModelList.first; } else { selectedCarModel.value = CarModel(); } update(); } catch (e) { log("Error loading car models: $e"); } } String getReadableServiceType(String key) { switch (key) { case 'cab-service': return 'Cab Service'; case 'parcel_delivery': return 'Parcel Service'; case 'rental-service': return 'Rental Service'; default: return 'Delivery Service'; } } String getServiceTypeKey(String name) { switch (name) { case 'Cab Service': return 'cab-service'; case 'Parcel Service': return 'parcel_delivery'; case 'Rental Service': return 'rental-service'; default: return 'delivery_service'; } } }