import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constant/box_name.dart'; import '../../../controller/admin/captain_admin_controller.dart'; import '../../../main.dart'; import 'captain_details.dart'; class CaptainsPage extends StatelessWidget { CaptainsPage({super.key}); final CaptainAdminController captainController = Get.put(CaptainAdminController()); final TextEditingController searchController = TextEditingController(); final String myPhone = box.read(BoxName.adminPhone).toString(); bool get isSuperAdmin => myPhone == '963942542053' || myPhone == '963992952235'; @override Widget build(BuildContext context) { final cs = Theme.of(context).colorScheme; return Scaffold( backgroundColor: cs.surface, body: Column( children: [ _buildAppBar(context, cs), _buildSearchSection(context, cs), Expanded( child: GetBuilder( builder: (controller) { if (controller.isLoading) { return _buildLoadingState(cs); } final message = controller.captainData['message']; if (message == null) { return _buildEmptyState(cs); } final List captains = message is List ? message : [message]; if (captains.isEmpty) { return _buildEmptyState(cs); } return _buildResultsList(context, captains, cs); }, ), ), ], ), ); } Widget _buildAppBar(BuildContext context, ColorScheme cs) { return Container( padding: const EdgeInsets.fromLTRB(16, 50, 16, 16), decoration: BoxDecoration( color: cs.surface, border: Border(bottom: BorderSide(color: cs.outline)), ), child: Row( children: [ GestureDetector( onTap: () => Get.back(), child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(10), border: Border.all(color: cs.outline), ), child: Icon(Icons.arrow_back_ios_new_rounded, color: cs.onSurfaceVariant, size: 16), ), ), const SizedBox(width: 12), Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: cs.primary.withValues(alpha: 0.12), borderRadius: BorderRadius.circular(10), border: Border.all( color: cs.primary.withValues(alpha: 0.25)), ), child: Icon(Icons.drive_eta_rounded, color: cs.primary, size: 18), ), const SizedBox(width: 10), Text( 'قائمة الكباتن', style: TextStyle( color: cs.onSurface, fontSize: 18, fontWeight: FontWeight.w700, ), ), ], ), ); } Widget _buildSearchSection(BuildContext context, ColorScheme cs) { return Container( padding: const EdgeInsets.fromLTRB(16, 16, 16, 16), child: Container( decoration: BoxDecoration( color: cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(14), border: Border.all(color: cs.outline), ), child: Row( children: [ Expanded( child: TextField( controller: searchController, keyboardType: TextInputType.phone, style: TextStyle(color: cs.onSurface, fontSize: 14), cursorColor: cs.primary, decoration: InputDecoration( hintText: '0990000000', hintStyle: TextStyle( color: cs.onSurfaceVariant, fontSize: 13), prefixIcon: Icon(Icons.phone_android_rounded, color: cs.onSurfaceVariant, size: 20), border: InputBorder.none, contentPadding: const EdgeInsets.symmetric( horizontal: 16, vertical: 14), ), onSubmitted: (_) => _performSearch(), ), ), Padding( padding: const EdgeInsets.all(6.0), child: Material( color: cs.primary, borderRadius: BorderRadius.circular(10), child: InkWell( onTap: _performSearch, borderRadius: BorderRadius.circular(10), child: const Padding( padding: EdgeInsets.all(10), child: Icon(Icons.search_rounded, color: Colors.white, size: 20), ), ), ), ), ], ), ), ); } void _performSearch() { final phone = searchController.text.trim(); if (phone.isNotEmpty) { captainController.find_driver_by_phone(phone); } } Widget _buildLoadingState(ColorScheme cs) { return Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ SizedBox( width: 40, height: 40, child: CircularProgressIndicator( color: cs.primary, strokeWidth: 2, backgroundColor: cs.primary.withValues(alpha: 0.1), ), ), const SizedBox(height: 16), Text('جاري التحميل...', style: TextStyle( color: cs.onSurfaceVariant, fontSize: 13)), ], ), ); } Widget _buildEmptyState(ColorScheme cs) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: cs.surfaceContainerHighest, shape: BoxShape.circle, ), child: Icon(Icons.person_off_outlined, size: 48, color: cs.onSurfaceVariant), ), const SizedBox(height: 16), Text('لا يوجد كباتن', style: TextStyle( color: cs.onSurfaceVariant, fontSize: 14)), ], ), ); } Widget _buildResultsList( BuildContext context, List captains, ColorScheme cs) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.fromLTRB(20, 8, 20, 8), child: Row( children: [ Container( width: 3, height: 14, decoration: BoxDecoration( color: cs.primary, borderRadius: BorderRadius.circular(2), ), ), const SizedBox(width: 8), Text( 'نتائج البحث', style: TextStyle( color: cs.onSurface, fontSize: 15, fontWeight: FontWeight.w600, ), ), const SizedBox(width: 10), Expanded( child: Container(height: 1, color: cs.outline), ), const SizedBox(width: 8), Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4), decoration: BoxDecoration( color: cs.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(10), border: Border.all( color: cs.primary.withValues(alpha: 0.2)), ), child: Text( '${captains.length}', style: TextStyle( color: cs.primary, fontSize: 12, fontWeight: FontWeight.w700, ), ), ), ], ), ), Expanded( child: ListView.separated( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.fromLTRB(16, 0, 16, 80), itemCount: captains.length, separatorBuilder: (_, __) => const SizedBox(height: 10), itemBuilder: (context, index) { final captain = captains[index] as Map; return _buildCaptainCard(context, captain, cs); }, ), ), ], ); } Widget _buildCaptainCard( BuildContext context, Map captain, ColorScheme cs) { final String fullName = '${captain['first_name'] ?? ''} ${captain['last_name'] ?? ''}'; final String phone = captain['phone']?.toString() ?? ''; final String? email = captain['email']?.toString(); return Container( decoration: BoxDecoration( color: cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(16), border: Border.all(color: cs.outline), ), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(16), onTap: () { Get.to(() => const CaptainDetailsPage(), arguments: {'data': captain}); }, child: Padding( padding: const EdgeInsets.all(14), child: Row( children: [ Container( width: 52, height: 52, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ cs.primary.withValues(alpha: 0.8), cs.primary, ], ), borderRadius: BorderRadius.circular(14), boxShadow: [ BoxShadow( color: cs.primary.withValues(alpha: 0.2), blurRadius: 10, offset: const Offset(0, 4), ), ], ), child: const Icon( Icons.person_rounded, color: Colors.white, size: 26, ), ), const SizedBox(width: 14), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( fullName, style: TextStyle( color: cs.onSurface, fontSize: 15, fontWeight: FontWeight.w600, ), ), const SizedBox(height: 6), Row( children: [ Icon(Icons.phone_rounded, size: 13, color: cs.onSurfaceVariant), const SizedBox(width: 4), Text( phone, style: TextStyle( color: cs.onSurfaceVariant, fontSize: 12, fontFamily: 'monospace', ), ), ], ), if (isSuperAdmin && email != null) ...[ const SizedBox(height: 3), Row( children: [ Icon(Icons.email_outlined, size: 12, color: cs.onSurfaceVariant), const SizedBox(width: 4), Text( email, style: TextStyle( color: cs.onSurfaceVariant, fontSize: 11, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ], ], ), ), Icon(Icons.arrow_forward_ios_rounded, size: 14, color: cs.onSurfaceVariant), ], ), ), ), ), ); } }