import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; import '../../../constant/colors.dart'; import '../../../controller/admin/passenger_admin_controller.dart'; import '../../../controller/functions/crud.dart'; import '../../../controller/firebase/firbase_messge.dart'; import '../../../constant/links.dart'; import '../../../main.dart'; // To access 'box' for admin phone check import '../../widgets/elevated_btn.dart'; import '../../widgets/my_scafold.dart'; import '../../widgets/my_textField.dart'; import 'form_passenger.dart'; class PassengerDetailsPage extends StatelessWidget { const PassengerDetailsPage({super.key}); @override Widget build(BuildContext context) { final Map data = Get.arguments['data']; final controller = Get.find(); // 1. Define Super Admin Logic (Same as Captains Page) String myPhone = box.read(BoxName.adminPhone).toString(); bool isSuperAdmin = myPhone == '963942542053' || myPhone == '963992952235'; return MyScafolld( title: 'Passenger Profile'.tr, isleading: true, body: [ SingleChildScrollView( padding: const EdgeInsets.only(bottom: 40), child: Column( children: [ // --- Header Section (Avatar & Name) --- _buildHeaderSection(context, data), const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( children: [ // --- Personal Information Card --- _buildInfoCard( title: 'Personal Information', icon: Icons.person, children: [ _buildDetailTile( Icons.email_outlined, 'Email', isSuperAdmin ? data['email'] : _maskEmail(data['email']), ), _buildDetailTile( Icons.phone_iphone, 'Phone', _formatPhoneNumber( data['phone'].toString(), isSuperAdmin), ), _buildDetailTile( Icons.transgender, 'Gender', data['gender'] ?? 'Not specified', ), _buildDetailTile( Icons.cake_outlined, 'Birthdate', data['birthdate'] ?? 'N/A', ), _buildDetailTile( Icons.location_on_outlined, 'Site', data['site'] ?? 'N/A', ), // SOS Phone is critical, usually shown, but we can mask it too if needed _buildDetailTile( Icons.sos, 'SOS Phone', data['sosPhone'] ?? 'N/A', valueColor: Colors.redAccent, ), ], ), const SizedBox(height: 16), // --- Ride Statistics Card --- _buildInfoCard( title: 'Activity & Stats', icon: Icons.bar_chart_rounded, children: [ _buildDetailTile( Icons.star_rate_rounded, 'Rating', '${data['ratingPassenger'] ?? 0.0}', valueColor: Colors.amber[700], ), _buildDetailTile( Icons.directions_car_filled_outlined, 'Total Rides', data['countPassengerRide'], ), _buildDetailTile( Icons.cancel_outlined, 'Canceled Rides', data['countPassengerCancel'], valueColor: Colors.redAccent, ), _buildDetailTile( Icons.rate_review_outlined, 'Feedback Given', data['countFeedback'], ), ], ), const SizedBox(height: 30), // --- Action Buttons --- _buildActionButtons( context, controller, data, isSuperAdmin), ], ), ), ], ), ), ], ); } // --- Header with Gradient/White Background --- Widget _buildHeaderSection(BuildContext context, Map data) { String firstName = data['first_name'] ?? ''; String lastName = data['last_name'] ?? ''; String fullName = '$firstName $lastName'.trim(); if (fullName.isEmpty) fullName = "Passenger"; return Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 25), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ) ], borderRadius: const BorderRadius.vertical(bottom: Radius.circular(30)), ), child: Column( children: [ CircleAvatar( radius: 45, backgroundColor: AppColor.primaryColor.withOpacity(0.1), child: Text( fullName[0].toUpperCase(), style: TextStyle( fontSize: 35, fontWeight: FontWeight.bold, color: AppColor.primaryColor), ), ), const SizedBox(height: 12), Text( fullName, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black87), ), const SizedBox(height: 4), Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), decoration: BoxDecoration( color: Colors.blue.withOpacity(0.1), borderRadius: BorderRadius.circular(20), ), child: Text( data['status'] ?? 'Active', style: const TextStyle( fontSize: 12, color: Colors.blue, fontWeight: FontWeight.w600), ), ), ], ), ); } Widget _buildInfoCard( {required String title, required IconData icon, required List children}) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.05), spreadRadius: 2, blurRadius: 10) ], border: Border.all(color: Colors.grey.withOpacity(0.1)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon(icon, color: AppColor.primaryColor, size: 22), const SizedBox(width: 10), Text(title.tr, style: const TextStyle( fontSize: 17, fontWeight: FontWeight.bold)), ], ), Divider(height: 25, color: Colors.grey.withOpacity(0.2)), ...children, ], ), ); } Widget _buildDetailTile(IconData icon, String label, dynamic value, {Color? valueColor}) { return Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.grey[100], borderRadius: BorderRadius.circular(8)), child: Icon(icon, color: Colors.grey[600], size: 18), ), const SizedBox(width: 14), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(label.tr, style: TextStyle(fontSize: 12, color: Colors.grey[500])), Text( value?.toString() ?? 'N/A', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w600, color: valueColor ?? Colors.black87), overflow: TextOverflow.ellipsis, ), ], ), ), ], ), ); } Widget _buildActionButtons( BuildContext context, PassengerAdminController controller, Map data, bool isSuperAdmin) { return Column( children: [ // --- Send Notification (For All Admins) --- SizedBox( width: double.infinity, height: 50, child: ElevatedButton.icon( icon: const Icon(Icons.notifications_active_outlined, color: Colors.white), label: Text("Send Notification".tr, style: const TextStyle(color: Colors.white, fontSize: 16)), style: ElevatedButton.styleFrom( backgroundColor: AppColor.primaryColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12)), ), onPressed: () => _showSendNotificationDialog(controller, data), ), ), // --- Edit/Delete (Super Admin Only) --- if (isSuperAdmin) ...[ const SizedBox(height: 16), Row( children: [ Expanded( child: ElevatedButton.icon( icon: const Icon(Icons.edit_note_rounded, size: 20), label: Text("Edit".tr), style: ElevatedButton.styleFrom( backgroundColor: Colors.white, foregroundColor: AppColor.yellowColor, elevation: 0, side: BorderSide(color: AppColor.yellowColor), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12)), padding: const EdgeInsets.symmetric(vertical: 12), ), onPressed: () { // Get.to(() => const FormPassenger(), arguments: { // 'isEditMode': true, // 'passengerData': data, // }); }, ), ), const SizedBox(width: 16), Expanded( child: ElevatedButton.icon( icon: const Icon(Icons.delete_outline_rounded, size: 20), label: Text("Delete".tr), style: ElevatedButton.styleFrom( backgroundColor: Colors.red[50], foregroundColor: Colors.red, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12)), padding: const EdgeInsets.symmetric(vertical: 12), ), onPressed: () => _showDeleteConfirmation(data), ), ), ], ), ] else ...[ // Message for normal admins const SizedBox(height: 15), Text( "Only Super Admins can edit or delete passengers.", style: TextStyle( color: Colors.grey[400], fontSize: 12, fontStyle: FontStyle.italic), ) ], ], ); } // --- Helper: Format Phone (Last 4 digits for normal admin) --- String _formatPhoneNumber(String phone, bool isSuperAdmin) { if (isSuperAdmin) return phone; if (phone.length <= 4) return phone; return '${'*' * (phone.length - 4)}${phone.substring(phone.length - 4)}'; } // --- Helper: Mask Email --- String _maskEmail(String? email) { if (email == null || email.isEmpty) return 'N/A'; int atIndex = email.indexOf('@'); if (atIndex <= 1) return email; // Too short to mask return '${email.substring(0, 2)}****${email.substring(atIndex)}'; } void _showSendNotificationDialog( PassengerAdminController controller, Map data) { Get.defaultDialog( title: 'Send Notification'.tr, titleStyle: const TextStyle(fontWeight: FontWeight.bold), content: Form( key: controller.formPrizeKey, child: Column( children: [ MyTextForm( controller: controller.titleNotify, label: 'Title'.tr, hint: 'Notification title'.tr, type: TextInputType.text), const SizedBox(height: 10), MyTextForm( controller: controller.bodyNotify, label: 'Body'.tr, hint: 'Message body'.tr, type: TextInputType.text) ], ), ), confirm: SizedBox( width: 100, child: MyElevatedButton( title: 'Send', onPressed: () { // Validate form safely if (controller.formPrizeKey.currentState?.validate() ?? false) { FirebaseMessagesController().sendNotificationToAnyWithoutData( controller.titleNotify.text, controller.bodyNotify.text, data['passengerToken'], 'order.wav'); Get.back(); Get.snackbar('Success', 'Notification sent successfully!', backgroundColor: Colors.green.withOpacity(0.2)); } }, ), ), cancel: TextButton( onPressed: () => Get.back(), child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), ); } void _showDeleteConfirmation(Map user) { Get.defaultDialog( title: 'Confirm Deletion'.tr, titleStyle: const TextStyle(color: Colors.redAccent, fontWeight: FontWeight.bold), middleText: 'Are you sure you want to delete ${user['first_name']}? This action cannot be undone.' .tr, confirm: ElevatedButton( style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent), onPressed: () async { // 1. Close Dialog Get.back(); // 2. Perform Delete Operation var res = await CRUD().post( link: AppLink.admin_delete_and_blacklist_passenger, payload: { 'id': user['id'], 'phone': user['phone'], 'reason': 'Deleted by admin', }, ); // 3. Handle Result if (res['status'] == 'success') { Get.back(); // Go back to list page Get.snackbar('Deleted', 'Passenger removed successfully', backgroundColor: Colors.red.withOpacity(0.2)); // Ideally, trigger a refresh on the controller here // Get.find().getAll(); } else { Get.snackbar('Error', res['message'] ?? 'Failed to delete', backgroundColor: Colors.red.withOpacity(0.2)); } }, child: Text('Delete'.tr, style: const TextStyle(color: Colors.white)), ), cancel: TextButton( onPressed: () => Get.back(), child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey)), ), ); } }