import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:siro_service/constant/colors.dart'; import 'package:siro_service/constant/links.dart'; import 'package:siro_service/controller/functions/crud.dart'; import 'package:siro_service/controller/mainController/main_controller.dart'; import 'package:siro_service/controller/mainController/pages/best_driver_page.dart'; import 'package:siro_service/controller/mainController/pages/complaint.dart'; import 'package:siro_service/controller/mainController/pages/edit_car_plate.dart'; import 'package:siro_service/controller/mainController/pages/passengers_cant_regster.dart'; import 'package:siro_service/views/widgets/elevated_btn.dart'; import 'package:siro_service/views/widgets/my_dialog.dart'; import 'package:siro_service/views/widgets/my_textField.dart'; import '../../constant/style.dart'; import '../../controller/mainController/pages/ride_monitor_page.dart'; import '../../controller/mainController/pages/add_car.dart'; import '../../controller/mainController/pages/drivers_cant_register.dart'; import '../../controller/mainController/pages/new_driver.dart'; import '../../controller/mainController/pages/welcome_call.dart'; import '../../main.dart'; import '../widgets/my_scafold.dart'; class Main extends StatelessWidget { Main({super.key}); final MainController mainController = Get.put(MainController()); @override Widget build(BuildContext context) { return MyScaffold(title: 'Siro Service'.tr, isleading: false, body: [ Container( color: AppColor.surfaceColor, child: SingleChildScrollView( physics: const BouncingScrollPhysics(), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // --- Header Section --- _buildHeader(), // --- Statistics Section --- _buildStatsSection(), // --- Actions Section --- _buildCategoryTitle('🔍 Search & Inquiries'.tr), _buildGridSection([ ServiceItem( title: 'passenger details by phone'.tr, icon: Icons.person_search_rounded, color: Colors.blue, onTap: () => _showSearchDialog( title: 'insert passenger phone'.tr, controller: mainController.passengerPhoneController, onSearch: () => mainController.searchPassengerByPhone(), ), ), ServiceItem( title: 'Driver details by phone'.tr, icon: Icons.contact_phone_rounded, color: Colors.indigo, onTap: () => _showSearchDialog( title: 'insert Driver phone'.tr, controller: mainController.driverPhoneController, onSearch: () => mainController.searchDriverByPhone(), ), ), ServiceItem( title: 'Driver details by national number'.tr, icon: Icons.badge_rounded, color: Colors.teal, onTap: () => _showSearchDialog( title: 'insert Driver national'.tr, controller: mainController.driverPhoneController, type: TextInputType.number, onSearch: () => mainController.searchDriverByNational(), ), ), ]), _buildCategoryTitle('⏳ Approval Queue'.tr), _buildGridSection([ ServiceItem( title: 'Drivers waitting Register'.tr, icon: Icons.pending_actions_rounded, color: Colors.orange, onTap: () async { await mainController.getDriverWantCompleteRegistration(); Get.to(() => DriversCantRegister()); }, ), ServiceItem( title: 'Drivers phones not register'.tr, icon: Icons.phone_disabled_rounded, color: Colors.blueGrey, onTap: () async { await mainController.getDriversPhoneNotComplete(); Get.to(() => DriversCantRegister()); }, ), ServiceItem( title: 'Drivers Activity'.tr, icon: Icons.assessment_rounded, color: Colors.blueAccent, onTap: () async { await mainController.getDriversPhoneNotComplete(); Get.to(() => DriversCantRegister()); }, ), ServiceItem( title: 'Drivers Cant Register'.tr, icon: Icons.car_crash_rounded, color: Colors.redAccent, onTap: () async { await mainController.getDriverNotCompleteRegistration(); Get.to(() => DriversCantRegister()); }, ), ServiceItem( title: 'Passengers Cant Register'.tr, icon: Icons.group_off_rounded, color: Colors.deepOrange, onTap: () async { await mainController.getPassengerNotCompleteRegistration(); Get.to(() => PassengersCantRegister()); }, ), ]), _buildCategoryTitle('⚡ Quick Actions'.tr), _buildGridSection([ ServiceItem( title: 'Register new driver'.tr, icon: Icons.person_add_rounded, color: Colors.green, onTap: () => Get.to(() => RegisterCaptain()), ), ServiceItem( title: 'Add Driver Who Wants to Work'.tr, icon: Icons.handshake_rounded, color: Colors.lightGreen, onTap: () => _showAddDriverDialog(), ), ServiceItem( title: 'Add Car Who Wants to Work'.tr, icon: Icons.add_road_rounded, color: Colors.cyan, onTap: () => _showAddCarDialog(), ), ]), _buildCategoryTitle('🚗 Vehicle Management'.tr), _buildGridSection([ ServiceItem( title: 'Add car'.tr, icon: Icons.add_circle_outline_rounded, color: Colors.purple, onTap: () async { await mainController.getdriverWithoutCar(); if (mainController.driverWithoutCar.isNotEmpty) { Get.to(() => const AddCar()); } }, ), ServiceItem( title: 'Edit car plate'.tr, icon: Icons.edit_attributes_rounded, color: Colors.amber, onTap: () async { await mainController.getCarPlateNotEdit(); if (mainController.carPlateNotEdit.isNotEmpty) { Get.to(() => const EditCarPlate()); } }, ), ]), _buildCategoryTitle('🚗 متابعة الرحلات'.tr), _buildGridSection([ ServiceItem( title: 'متابعة رحلة', icon: Icons.map_rounded, color: const Color(0xFF4318FF), onTap: () => Get.to(() => const RideMonitorServicePage()), ), ]), _buildCategoryTitle('📊 Reporting & Quality'.tr), _buildGridSection([ ServiceItem( title: "View complaint".tr, icon: Icons.report_problem_rounded, color: Colors.deepOrange, onTap: () => Get.to(() => const Complaint()), ), ServiceItem( title: "Welcome call".tr, icon: Icons.ring_volume_rounded, color: Colors.pink, onTap: () async { await mainController.getNewDriverRegister(); Get.to(() => const WelcomeCall()); }, ), ServiceItem( title: "best driver".tr, icon: Icons.emoji_events_rounded, color: Colors.orangeAccent, onTap: () async { await mainController.getNewDriverRegister(); Get.to(() => DriverTheBest()); }, ), ]), const SizedBox(height: 32), ], ), ), ), ]); } Widget _buildHeader() { return Container( padding: const EdgeInsets.all(24), decoration: const BoxDecoration( color: AppColor.primaryColor, borderRadius: BorderRadius.only( bottomLeft: Radius.circular(32), bottomRight: Radius.circular(32), ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Welcome back,'.tr, style: AppStyle.title.copyWith(color: Colors.white70), ), Text( 'Service Agent'.tr, style: AppStyle.headTitle2.copyWith(color: Colors.white), ), ], ), Row( children: [ IconButton( icon: const Icon(Icons.refresh_rounded, color: Colors.white), onPressed: () => mainController.refreshDashboardStats(), ), const SizedBox(width: 8), CircleAvatar( radius: 24, backgroundColor: Colors.white24, child: IconButton( icon: const Icon(Icons.logout, color: Colors.white), onPressed: () { box.erase(); Get.offAllNamed('/login'); }, ), ), ], ), ], ), const SizedBox(height: 24), // --- Custom Search Bar --- Container( margin: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16), decoration: AppStyle.boxDecoration.copyWith( color: Colors.white.withValues(alpha: 0.95), borderRadius: BorderRadius.circular(16), ), child: TextField( decoration: InputDecoration( hintText: 'Quick Search...'.tr, border: InputBorder.none, icon: const Icon(Icons.search, color: AppColor.primaryColor), ), onSubmitted: (val) { // Global search logic }, ), ), ], ), ); } Widget _buildStatsSection() { return GetBuilder( builder: (controller) { return Padding( padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0), child: Row( children: [ _buildStatCard( 'Pending'.tr, controller.isLoading ? '...' : controller.driverWantCompleteRegistration.length .toString(), Icons.timer_rounded, Colors.orange, ), const SizedBox(width: 12), _buildStatCard( 'New'.tr, controller.isLoading ? '...' : controller.newDriverRegister.length.toString(), Icons.person_add_alt_1_rounded, Colors.green, ), const SizedBox(width: 12), _buildStatCard( 'Issues'.tr, controller.isLoading ? '...' : controller.driverNotCompleteRegistration.length .toString(), Icons.warning_rounded, Colors.red, ), ], ), ); }, ); } Widget _buildStatCard( String title, String count, IconData icon, Color color) { return Expanded( child: Container( padding: const EdgeInsets.all(16), decoration: AppStyle.boxDecoration, child: Column( children: [ Icon(icon, color: color, size: 24), const SizedBox(height: 8), Text(count, style: AppStyle.headTitle2.copyWith(fontSize: 20)), Text(title, style: AppStyle.subtitle.copyWith(color: AppColor.accentColor)), ], ), ), ); } Widget _buildCategoryTitle(String title) { return Padding( padding: const EdgeInsets.fromLTRB(20, 24, 20, 12), child: Text( title, style: AppStyle.headTitle2.copyWith(fontSize: 18), ), ); } Widget _buildGridSection(List items) { return GridView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.symmetric(horizontal: 16), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 12, mainAxisSpacing: 12, childAspectRatio: 1.15, ), itemCount: items.length, itemBuilder: (context, index) { final item = items[index]; return _buildServiceCard(item); }, ); } Widget _buildServiceCard(ServiceItem item) { return InkWell( onTap: item.onTap, borderRadius: BorderRadius.circular(20), child: Container( decoration: AppStyle.boxDecoration1, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: item.color.withValues(alpha: 0.1), shape: BoxShape.circle, ), child: Icon(item.icon, color: item.color, size: 30), ), const SizedBox(height: 12), Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Text( item.title, textAlign: TextAlign.center, style: AppStyle.title .copyWith(fontSize: 13, fontWeight: FontWeight.w600), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), ], ), ), ); } void _showSearchDialog({ required String title, required TextEditingController controller, required VoidCallback onSearch, TextInputType type = TextInputType.phone, }) { MyDialog().getDialog( title, 'Search Details'.tr, Form( key: mainController.formKey, child: Column( mainAxisSize: MainAxisSize.min, children: [ MyTextForm( controller: controller, label: title, hint: title, type: type, validator: (val) { if (val == null || val.isEmpty) { return 'Please enter a value'.tr; } return null; }, ), ], ), ), onSearch, ); } void _showAddDriverDialog() { Get.defaultDialog( barrierDismissible: false, title: "Add Driver Who Wants to Work".tr, titleStyle: AppStyle.headTitle2, content: SizedBox( width: Get.width * .8, height: 350, child: Form( key: mainController.formKey, child: ListView( padding: const EdgeInsets.all(8), children: [ MyTextForm( controller: mainController.driverNameController, label: 'Insert Name of Driver'.tr, hint: 'Insert Name of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.nationalIdController, label: 'Insert national ID of Driver'.tr, hint: 'Insert national ID of Driver'.tr, type: TextInputType.number), MyTextForm( controller: mainController.phoneController, label: 'Insert phone of Driver'.tr, hint: 'Insert phone of Driver'.tr, type: TextInputType.phone), MyTextForm( controller: mainController.licenseTypeController, label: 'Insert license type of Driver'.tr, hint: 'Insert license type of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.siteDriverController, label: 'Insert site of Driver'.tr, hint: 'Insert site of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.birthDateController, label: 'Insert birth_date of Driver'.tr, hint: 'YYYY-MM-DD'.tr, type: TextInputType.datetime), ], ), ), ), confirm: MyElevatedButton( title: 'Add'.tr, onPressed: () async { var res = await CRUD().post(link: AppLink.addDriverWantWork, payload: { "driver_name": mainController.driverNameController.text, "national_id": mainController.nationalIdController.text, "birth_date": mainController.birthDateController.text, "site": mainController.siteDriverController.text, "license_type": mainController.licenseTypeController.text, "phone": mainController.phoneController.text, }); if (res != 'failure' && res['status'] == 'success') { Get.back(); mainController.driverNameController.clear(); mainController.nationalIdController.clear(); mainController.birthDateController.clear(); mainController.licenseTypeController.clear(); mainController.siteDriverController.clear(); mainController.phoneController.clear(); Get.snackbar('Success'.tr, 'Added successfully'.tr, backgroundColor: AppColor.greenColor, colorText: Colors.white); } }, kolor: AppColor.greenColor, ), cancel: MyElevatedButton( title: 'Cancel'.tr, kolor: AppColor.redColor, onPressed: () => Get.back()), ); } void _showAddCarDialog() { Get.defaultDialog( barrierDismissible: false, title: "Add Car Who Wants to Work".tr, titleStyle: AppStyle.headTitle2, content: SizedBox( width: Get.width * .8, height: 350, child: Form( key: mainController.formKey, child: ListView( padding: const EdgeInsets.all(8), children: [ MyTextForm( controller: mainController.carOwnerWorkController, label: 'Insert Name of Owner'.tr, hint: 'Insert Name of Owner'.tr, type: TextInputType.name), MyTextForm( controller: mainController.carNumberController, label: 'Insert car_number of Driver'.tr, hint: 'Insert car_number of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.phoneCarController, label: 'Insert phone of Owner'.tr, hint: 'Insert phone of Owner'.tr, type: TextInputType.phone), MyTextForm( controller: mainController.manufactureYearController, label: 'Insert year of Car'.tr, hint: 'Insert year of Car'.tr, type: TextInputType.number), MyTextForm( controller: mainController.carModelController, label: 'Insert car_model of Driver'.tr, hint: 'Insert car_model of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.siteCarController, label: 'Insert site of Owner'.tr, hint: 'Insert site of Owner'.tr, type: TextInputType.name), MyTextForm( controller: mainController.carTypeController, label: 'Insert car_type of Driver'.tr, hint: 'Insert car_type of Driver'.tr, type: TextInputType.name), MyTextForm( controller: mainController.registrationDateController, label: 'Insert registration_date of Car'.tr, hint: 'YYYY-MM-DD'.tr, type: TextInputType.datetime), ], ), ), ), confirm: MyElevatedButton( title: 'Add'.tr, onPressed: () async { var res = await CRUD().post(link: AppLink.addCarWantWork, payload: { "owner_name": mainController.carOwnerWorkController.text, "car_number": mainController.carNumberController.text, "manufacture_year": mainController.manufactureYearController.text, "car_model": mainController.carModelController.text, "car_type": mainController.carTypeController.text, "site": mainController.siteCarController.text, "registration_date": mainController.registrationDateController.text, "phone": mainController.phoneCarController.text, }); if (res != 'failure' && res['status'] == 'success') { Get.back(); mainController.carOwnerWorkController.clear(); mainController.carNumberController.clear(); mainController.manufactureYearController.clear(); mainController.carModelController.clear(); mainController.siteCarController.clear(); mainController.carTypeController.clear(); mainController.registrationDateController.clear(); mainController.phoneCarController.clear(); Get.snackbar('Success'.tr, 'Added successfully'.tr, backgroundColor: AppColor.greenColor, colorText: Colors.white); } }, kolor: AppColor.greenColor, ), cancel: MyElevatedButton( title: 'Cancel'.tr, kolor: AppColor.redColor, onPressed: () => Get.back()), ); } } class ServiceItem { final String title; final IconData icon; final Color color; final VoidCallback onTap; ServiceItem({ required this.title, required this.icon, required this.color, required this.onTap, }); }