import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; import '../../../constant/colors.dart'; import '../../../constant/style.dart'; import '../../../controller/admin/passenger_admin_controller.dart'; import '../../../main.dart'; // للوصول إلى box import '../../widgets/elevated_btn.dart'; import '../../widgets/my_scafold.dart'; import '../../widgets/my_textField.dart'; import '../../widgets/mycircular.dart'; import 'passenger_details_page.dart'; class Passengrs extends StatelessWidget { Passengrs({super.key}); final PassengerAdminController passengerAdminController = Get.put(PassengerAdminController()); @override Widget build(BuildContext context) { // 1. منطق السوبر أدمن String myPhone = box.read(BoxName.adminPhone).toString(); bool isSuperAdmin = myPhone == '963942542053' || myPhone == '963992952235'; return MyScafolld( title: 'Passengers Management'.tr, isleading: true, body: [ // استخدام Expanded أو Container بطول الشاشة لتجنب المشاكل SizedBox( height: Get.height, // تأمين مساحة العمل child: GetBuilder( builder: (controller) { if (controller.isLoading) { return const Center(child: MyCircularProgressIndicator()); } return Column( children: [ // --- قسم الإحصائيات والجوائز (Dashboard) --- Padding( padding: const EdgeInsets.all(16.0), child: _buildDashboardCard(context, controller), ), // --- عنوان القائمة --- Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "All Passengers".tr, style: AppStyle.title.copyWith( fontSize: 18, fontWeight: FontWeight.bold), ), Text( "${controller.passengersData['message']?.length ?? 0} Users", style: TextStyle(color: Colors.grey[600], fontSize: 12), ), ], ), ), const SizedBox(height: 10), // --- قائمة الركاب --- // استخدام Expanded هنا هو الحل الجذري لمكلة Overflow Expanded( child: _buildPassengersList(controller, isSuperAdmin), ), // مساحة سفلية صغيرة لضمان عدم التصاق القائمة بالحافة const SizedBox(height: 20), ], ); }, ), ), ], ); } // --- تصميم بطاقة الإحصائيات (Dashboard) --- Widget _buildDashboardCard( BuildContext context, PassengerAdminController controller) { // جلب العدد بأمان final String countValue = (controller.passengersData['message'] != null && controller.passengersData['message'].isNotEmpty) ? controller.passengersData['message'][0]['countPassenger'] ?.toString() ?? '0' : '0'; return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.1), blurRadius: 15, offset: const Offset(0, 5), ), ], ), child: Column( children: [ Row( children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: AppColor.primaryColor.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon(Icons.groups_rounded, color: AppColor.primaryColor, size: 30), ), const SizedBox(width: 15), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Total Passengers'.tr, style: const TextStyle(fontSize: 14, color: Colors.grey), ), Text( countValue, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold), ), ], ), ], ), const SizedBox(height: 20), SizedBox( width: double.infinity, height: 45, child: ElevatedButton.icon( icon: const Icon(Icons.card_giftcard, color: Colors.white, size: 20), label: Text('Add Prize to Gold Passengers'.tr, style: const TextStyle( color: Colors.white, fontWeight: FontWeight.bold)), style: ElevatedButton.styleFrom( backgroundColor: AppColor.yellowColor, // لون ذهبي shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12)), elevation: 0, ), onPressed: () { _showAddPrizeDialog(controller); }, ), ), ], ), ); } // --- بناء قائمة الركاب --- Widget _buildPassengersList( PassengerAdminController controller, bool isSuperAdmin) { final List passengers = controller.passengersData['message'] ?? []; if (passengers.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.person_off_outlined, size: 60, color: Colors.grey[300]), const SizedBox(height: 10), Text("No passengers found".tr, style: TextStyle(color: Colors.grey[400])), ], ), ); } return ListView.separated( padding: const EdgeInsets.symmetric(horizontal: 16), physics: const BouncingScrollPhysics(), itemCount: passengers.length, separatorBuilder: (context, index) => const SizedBox(height: 12), itemBuilder: (context, index) { final user = passengers[index]; return _buildPassengerItem(user, isSuperAdmin); }, ); } // --- عنصر الراكب الواحد (Card) --- Widget _buildPassengerItem(dynamic user, bool isSuperAdmin) { String firstName = user['first_name'] ?? ''; String lastName = user['last_name'] ?? ''; String fullName = '$firstName $lastName'.trim(); if (fullName.isEmpty) fullName = 'Unknown User'; return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(15), border: Border.all(color: Colors.grey.withOpacity(0.1)), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.05), blurRadius: 5, offset: const Offset(0, 2), ), ], ), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(15), onTap: () { // الانتقال للتفاصيل مع تمرير صلاحية الأدمن Get.to( () => const PassengerDetailsPage(), arguments: {'data': user, 'isSuperAdmin': isSuperAdmin}, ); }, child: Padding( padding: const EdgeInsets.all(12.0), child: Row( children: [ // Avatar CircleAvatar( radius: 25, backgroundColor: AppColor.primaryColor.withOpacity(0.1), child: Text( fullName.isNotEmpty ? fullName[0].toUpperCase() : 'U', style: TextStyle( color: AppColor.primaryColor, fontWeight: FontWeight.bold, fontSize: 18), ), ), const SizedBox(width: 15), // Info Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( fullName, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16), ), const SizedBox(height: 4), // Stats Row Row( children: [ Icon(Icons.star_rounded, size: 16, color: Colors.amber[700]), Text( " ${user['ratingPassenger'] ?? '0.0'} ", style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold), ), const SizedBox(width: 8), Icon(Icons.directions_car, size: 14, color: Colors.grey[400]), Text( " ${user['countPassengerRide'] ?? '0'} Trips", style: TextStyle( fontSize: 12, color: Colors.grey[600]), ), ], ), const SizedBox(height: 4), // Phone Number (Masked logic) Row( children: [ Icon(Icons.phone_iphone, size: 12, color: Colors.grey[400]), const SizedBox(width: 4), Text( _formatPhoneNumber( user['phone'].toString(), isSuperAdmin), style: TextStyle( fontSize: 12, color: Colors.grey[500], fontFamily: 'monospace'), ), ], ), // Email (Show only if Super Admin) if (isSuperAdmin && user['email'] != null) ...[ const SizedBox(height: 2), Text( user['email'], style: TextStyle(fontSize: 10, color: Colors.grey[400]), maxLines: 1, overflow: TextOverflow.ellipsis, ) ] ], ), ), // Arrow Icon(Icons.arrow_forward_ios_rounded, size: 16, color: Colors.grey[300]), ], ), ), ), ), ); } // --- دالة تنسيق الرقم (إظهار آخر 4 أرقام لغير الأدمن) --- String _formatPhoneNumber(String phone, bool isSuperAdmin) { if (isSuperAdmin) return phone; // إظهار الرقم كاملاً للسوبر أدمن // لغير الأدمن if (phone.length <= 4) return phone; String lastFour = phone.substring(phone.length - 4); String masked = '*' * (phone.length - 4); return '$masked$lastFour'; // النتيجة: *******5678 } // --- دالة إضافة الجوائز --- void _showAddPrizeDialog(PassengerAdminController controller) { // التحقق من يوم السبت if (DateTime.now().weekday == DateTime.saturday) { Get.defaultDialog( title: 'Add Prize'.tr, titleStyle: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18), contentPadding: const EdgeInsets.all(20), content: Form( key: controller.formPrizeKey, child: Column( children: [ Text( 'Add Points to Gold Passengers wallet'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 14, color: Colors.grey[700]), ), const SizedBox(height: 20), MyTextForm( controller: controller.passengerPrizeController, label: 'Prize Amount'.tr, hint: '1000...', type: TextInputType.number, ), ], ), ), confirm: SizedBox( width: 120, child: MyElevatedButton( title: 'Add', onPressed: () async { if (controller.formPrizeKey.currentState!.validate()) { controller.addPassengerPrizeToWalletSecure(); Get.back(); } }, ), ), cancel: TextButton( onPressed: () => Get.back(), child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), ); } else { Get.snackbar( 'Not Allowed'.tr, 'Prizes can only be added on Saturdays.'.tr, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, icon: const Icon(Icons.error_outline, color: Colors.red), snackPosition: SnackPosition.TOP, margin: const EdgeInsets.all(10), ); } } }