import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:siro_service/constant/box_name.dart'; import 'package:siro_service/constant/links.dart'; import 'package:siro_service/controller/functions/crud.dart'; import 'package:siro_service/main.dart'; class ReviewDriverController extends GetxController { var isLoading = true.obs; var isSaving = false.obs; var driverId = ''.obs; var phone = ''.obs; var serverData = {}.obs; var currentTabIndex = 0.obs; final Map docUrls = { 'id_front': ''.obs, 'id_back': ''.obs, 'driver_license': ''.obs, 'driver_license_back': ''.obs, 'car_license_front': ''.obs, 'car_license_back': ''.obs, 'criminal_record': ''.obs, 'profile_picture': ''.obs, }; final Map tabLabels = { 'id_front': 'ID Front', 'id_back': 'ID Back', 'driver_license': 'Driver License', 'driver_license_back': 'License Back', 'car_license_front': 'Car Reg Front', 'car_license_back': 'Car Reg Back', 'criminal_record': 'Criminal Record', 'profile_picture': 'Profile Photo', }; final Map tabIcons = { 'id_front': Icons.badge, 'id_back': Icons.badge_outlined, 'driver_license': Icons.drive_eta, 'driver_license_back': Icons.drive_eta_outlined, 'car_license_front': Icons.description, 'car_license_back': Icons.description_outlined, 'criminal_record': Icons.gavel, 'profile_picture': Icons.person, }; late TextEditingController firstNameController; late TextEditingController lastNameController; late TextEditingController phoneController; late TextEditingController emailController; late TextEditingController siteController; late TextEditingController nationalNumberController; late TextEditingController birthdateController; late TextEditingController addressController; late TextEditingController licenseCategoriesController; late TextEditingController licenseTypeController; late TextEditingController expiryDateController; late TextEditingController licenseIssueDateController; late TextEditingController ownerController; late TextEditingController carPlateController; late TextEditingController vinController; late TextEditingController carLicenseExpiryDateController; late TextEditingController makeController; late TextEditingController modelController; late TextEditingController yearController; var selectedGender = ''.obs; var colorHex = ''.obs; var colorName = ''.obs; var selectedFuel = ''.obs; @override void onInit() { super.onInit(); _initializeTextControllers(); final args = Get.arguments; if (args != null) { driverId.value = args['driverId'] ?? ''; phone.value = args['phone'] ?? ''; } fetchData(); } void _initializeTextControllers() { firstNameController = TextEditingController(); lastNameController = TextEditingController(); phoneController = TextEditingController(); emailController = TextEditingController(); siteController = TextEditingController(); nationalNumberController = TextEditingController(); birthdateController = TextEditingController(); addressController = TextEditingController(); licenseCategoriesController = TextEditingController(); licenseTypeController = TextEditingController(); expiryDateController = TextEditingController(); licenseIssueDateController = TextEditingController(); ownerController = TextEditingController(); carPlateController = TextEditingController(); vinController = TextEditingController(); carLicenseExpiryDateController = TextEditingController(); makeController = TextEditingController(); modelController = TextEditingController(); yearController = TextEditingController(); } Future fetchData() async { isLoading.value = true; try { var response = await CRUD().post( link: AppLink.getDriverDetailsForActivate, payload: {'driverId': driverId.value}, ); if (response != 'failure' && response['status'] == 'success' && (response['message'] as List).isNotEmpty) { var raw = response['message'][0] as Map; serverData.value = raw.map((key, value) => MapEntry(key, value?.toString() ?? '')); _populateControllers(); _populateDocUrls(raw['documents']); } } catch (e) { Get.snackbar('Error', 'Failed to load data: $e'); } finally { isLoading.value = false; } } void _populateDocUrls(dynamic docs) { if (docs is List) { for (var doc in docs) { if (doc is Map && doc['doc_type'] != null && doc['link'] != null) { String type = doc['doc_type'].toString(); if (docUrls.containsKey(type)) { docUrls[type]!.value = doc['link'].toString(); } } } } } void _populateControllers() { firstNameController.text = serverData['first_name'] ?? ''; lastNameController.text = serverData['last_name'] ?? ''; phoneController.text = serverData['phone'] ?? ''; emailController.text = serverData['email'] ?? ''; siteController.text = serverData['site'] ?? ''; nationalNumberController.text = serverData['national_number'] ?? ''; birthdateController.text = serverData['birthdate'] ?? ''; addressController.text = serverData['address'] ?? ''; licenseCategoriesController.text = serverData['license_categories'] ?? ''; licenseTypeController.text = serverData['license_type'] ?? ''; expiryDateController.text = serverData['expiry_date'] ?? ''; licenseIssueDateController.text = serverData['licenseIssueDate'] ?? serverData['issue_date'] ?? ''; selectedGender.value = serverData['gender'] ?? ''; ownerController.text = serverData['owner'] ?? ''; carPlateController.text = serverData['car_plate'] ?? ''; vinController.text = serverData['vin'] ?? ''; carLicenseExpiryDateController.text = serverData['expiration_date'] ?? ''; makeController.text = serverData['make'] ?? ''; modelController.text = serverData['model'] ?? ''; yearController.text = serverData['year'] ?? ''; selectedFuel.value = serverData['fuel'] ?? ''; final serverColorName = serverData['color'] ?? ''; final colorOption = kCarColorOptions.firstWhere( (opt) => opt['key'] == serverColorName, orElse: () => {'key': serverColorName, 'hex': '#000000'}, ); colorName.value = colorOption['key']!; colorHex.value = colorOption['hex']!; phone.value = serverData['phone'] ?? ''; } Future selectDate( BuildContext context, TextEditingController controller) async { DateTime initialDate = DateTime.now(); try { if (controller.text.isNotEmpty) { initialDate = DateFormat('yyyy-MM-dd').parse(controller.text); } } catch (_) {} DateTime? pickedDate = initialDate; await showCupertinoModalPopup( context: context, builder: (context) => Container( height: 280, color: CupertinoColors.systemBackground.resolveFrom(context), child: Column( children: [ SizedBox( height: 200, child: CupertinoDatePicker( initialDateTime: initialDate, minimumDate: DateTime(1950), maximumDate: DateTime(2050), mode: CupertinoDatePickerMode.date, onDateTimeChanged: (DateTime newDate) { pickedDate = newDate; }, ), ), CupertinoButton( child: const Text('Done'), onPressed: () { if (pickedDate != null) { controller.text = DateFormat('yyyy-MM-dd').format(pickedDate!); } Navigator.of(context).pop(); }, ), ], ), ), ); } Map _buildPayload() { return { 'driverId': driverId.value, 'phone': phoneController.text, 'first_name': firstNameController.text, 'last_name': lastNameController.text, 'site': siteController.text, 'national_number': nationalNumberController.text, 'gender': selectedGender.value, 'birthdate': birthdateController.text, 'address': addressController.text, 'email': emailController.text, 'license_type': licenseTypeController.text, 'license_categories': licenseCategoriesController.text, 'expiry_date': expiryDateController.text, 'license_issue_date': licenseIssueDateController.text, 'maritalStatus': box.read(BoxName.employeename) ?? 'unknown', 'owner': ownerController.text, 'color': colorName.value, 'color_hex': colorHex.value, 'car_plate': carPlateController.text, 'expiration_date': carLicenseExpiryDateController.text, 'make': makeController.text, 'model': modelController.text, 'fuel': selectedFuel.value, 'year': yearController.text, 'vin': vinController.text, }; } Future saveChanges() async { isSaving.value = true; try { var payload = _buildPayload(); payload['status'] = 'pending_review'; var response = await CRUD().post( link: AppLink.updateDriverToActive, payload: payload, ); if (response != 'failure' && response['status'] == 'success') { Get.snackbar('Success', 'Data saved successfully'); } else { Get.snackbar('Error', 'Failed to save changes'); } } catch (e) { Get.snackbar('Error', 'Error: $e'); } finally { isSaving.value = false; } } Future activateDriver() async { isSaving.value = true; try { var payload = _buildPayload(); var response = await CRUD().post( link: AppLink.updateDriverToActive, payload: payload, ); if (response != 'failure' && response['status'] == 'success') { Get.snackbar('Success', 'Driver activated successfully!'); await Future.delayed(const Duration(milliseconds: 500)); Get.back(); } else { Get.snackbar('Error', 'Failed to activate driver'); } } catch (e) { Get.snackbar('Error', 'Error: $e'); } finally { isSaving.value = false; } } Future rejectDriver(String reason) async { if (reason.trim().isEmpty) { Get.snackbar('Error', 'Please enter a rejection reason'); return; } isSaving.value = true; try { var response = await CRUD().post( link: AppLink.rejectDriver, payload: { 'driverId': driverId.value, 'reason': reason.trim(), }, ); if (response != 'failure' && response['status'] == 'success') { Get.snackbar('Success', 'Driver rejected'); await Future.delayed(const Duration(milliseconds: 500)); Get.back(); } else { Get.snackbar('Error', 'Failed to reject driver'); } } catch (e) { Get.snackbar('Error', 'Error: $e'); } finally { isSaving.value = false; } } void showRejectDialog() { final reasonController = TextEditingController(); Get.defaultDialog( title: 'Reject Driver'.tr, content: Padding( padding: const EdgeInsets.all(8), child: TextField( controller: reasonController, maxLines: 3, decoration: InputDecoration( hintText: 'Enter rejection reason...'.tr, border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), ), ), confirm: ElevatedButton( style: ElevatedButton.styleFrom(backgroundColor: Colors.red), onPressed: () => rejectDriver(reasonController.text), child: Text('Reject'.tr, style: const TextStyle(color: Colors.white)), ), cancel: ElevatedButton( onPressed: () => Get.back(), child: Text('Cancel'.tr), ), ); } static const List> kCarColorOptions = [ {'key': 'white', 'hex': '#FFFFFF'}, {'key': 'black', 'hex': '#000000'}, {'key': 'silver', 'hex': '#C0C0C0'}, {'key': 'gray', 'hex': '#808080'}, {'key': 'gunmetal', 'hex': '#2A3439'}, {'key': 'red', 'hex': '#C62828'}, {'key': 'blue', 'hex': '#1565C0'}, {'key': 'navy', 'hex': '#0D47A1'}, {'key': 'green', 'hex': '#2E7D32'}, {'key': 'darkGreen', 'hex': '#1B5E20'}, {'key': 'beige', 'hex': '#D7CCC8'}, {'key': 'brown', 'hex': '#5D4037'}, {'key': 'maroon', 'hex': '#800000'}, {'key': 'burgundy', 'hex': '#800020'}, {'key': 'yellow', 'hex': '#F9A825'}, {'key': 'orange', 'hex': '#EF6C00'}, {'key': 'gold', 'hex': '#D4AF37'}, {'key': 'bronze', 'hex': '#CD7F32'}, {'key': 'champagne', 'hex': '#EFE1C6'}, {'key': 'purple', 'hex': '#6A1B9A'}, ]; static const List kFuelOptions = [ 'بنزين', 'ديزل', 'هايبرد', 'كهربائي', ]; Color hexToColor(String code) => Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); void updateColorSelection(String hex) { colorHex.value = hex; colorName.value = kCarColorOptions.firstWhere((o) => o['hex'] == hex)['key']!; } @override void onClose() { firstNameController.dispose(); lastNameController.dispose(); phoneController.dispose(); emailController.dispose(); siteController.dispose(); nationalNumberController.dispose(); birthdateController.dispose(); addressController.dispose(); licenseCategoriesController.dispose(); licenseTypeController.dispose(); expiryDateController.dispose(); licenseIssueDateController.dispose(); ownerController.dispose(); carPlateController.dispose(); vinController.dispose(); carLicenseExpiryDateController.dispose(); makeController.dispose(); modelController.dispose(); yearController.dispose(); super.onClose(); } }