import 'package:siro_admin/constant/theme.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:get/get.dart'; import '../../../controller/admin/promo_controller.dart'; import '../../widgets/elevated_btn.dart'; import '../../widgets/my_textField.dart'; import '../../widgets/mydialoug.dart'; class PromoManagementPage extends StatelessWidget { PromoManagementPage({super.key}); final PromoController controller = Get.put(PromoController()); @override Widget build(BuildContext context) { final cs = Theme.of(context).colorScheme; return Scaffold( backgroundColor: cs.surface, body: Column( children: [ Container( padding: const EdgeInsets.fromLTRB(16, 50, 16, 16), 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), Text('إدارة أكواد الخصم'.tr, style: TextStyle(color: cs.onSurface, fontSize: 18, fontWeight: FontWeight.w700)), const Spacer(), IconButton( icon: Icon(Icons.add_circle_outline_rounded, color: cs.primary), onPressed: () => _showPromoSheet(context), ), ], ), ), Expanded( child: Obx(() => controller.isLoading.value && controller.promoList.isEmpty ? Center(child: CircularProgressIndicator(color: cs.primary)) : controller.promoList.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration(shape: BoxShape.circle, color: cs.onSurfaceVariant.withValues(alpha: 0.1)), child: Icon(Icons.confirmation_number_outlined, size: 48, color: cs.onSurfaceVariant), ), const SizedBox(height: 16), Text('لا يوجد أكواد خصم حالياً', style: GoogleFonts.inter(color: cs.onSurfaceVariant, fontSize: 14)), ], ), ) : RefreshIndicator( onRefresh: () => controller.getPromos(), child: ListView.builder( padding: const EdgeInsets.fromLTRB(16, 16, 16, 80), itemCount: controller.promoList.length, itemBuilder: (context, index) { final promo = controller.promoList[index]; return _buildPromoCard(context, promo); }, ), )), ), ], ), ); } Widget _buildPromoCard(BuildContext context, dynamic promo) { final cs = Theme.of(context).colorScheme; return Container( margin: const EdgeInsets.only(bottom: 12), decoration: BoxDecoration( color: cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(16), border: Border.all(color: cs.outline), ), child: ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), leading: Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: cs.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(12), ), child: Icon(Icons.local_offer_rounded, color: cs.primary), ), title: Text( promo['promo_code']?.toString() ?? 'N/A', style: GoogleFonts.inter(fontWeight: FontWeight.w600, color: cs.onSurface), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 4), Text(promo['description']?.toString() ?? '', style: GoogleFonts.inter(color: cs.onSurfaceVariant, fontSize: 12)), const SizedBox(height: 4), Row( children: [ Icon(Icons.money_rounded, size: 14, color: cs.success), const SizedBox(width: 4), Text('% ${promo['amount']}', style: GoogleFonts.jetBrainsMono(fontWeight: FontWeight.bold, color: cs.success)), const SizedBox(width: 12), Icon(Icons.person_rounded, size: 14, color: cs.tertiary), const SizedBox(width: 4), Text(promo['passengerID'] == 'none' ? 'عام' : 'مخصص', style: GoogleFonts.inter(color: cs.onSurfaceVariant, fontSize: 12)), ], ), ], ), trailing: PopupMenuButton( icon: Icon(Icons.more_vert_rounded, color: cs.onSurfaceVariant), color: cs.surfaceContainerHighest, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), itemBuilder: (context) => [ PopupMenuItem( value: 'edit', child: Row( children: [ Icon(Icons.edit_rounded, size: 18, color: cs.tertiary), const SizedBox(width: 8), Text('تعديل'.tr), ], ), ), PopupMenuItem( value: 'delete', child: Row( children: [ Icon(Icons.delete_outline_rounded, size: 18, color: cs.error), const SizedBox(width: 8), Text('حذف'.tr, style: TextStyle(color: cs.error)), ], ), ), ], onSelected: (value) { if (value == 'edit') { _showPromoSheet(context, promo: promo); } else if (value == 'delete') { MyDialog().getDialog( 'حذف كود الخصم', 'هل أنت متأكد من حذف كود الخصم ${promo['promo_code']}؟', () => controller.deletePromo(promo['id'].toString()).then((_) => Get.back()), ); } }, ), ), ); } void _showPromoSheet(BuildContext context, {dynamic promo}) { final cs = Theme.of(context).colorScheme; final TextEditingController codeController = TextEditingController(text: promo?['promo_code']); final TextEditingController amountController = TextEditingController(text: promo?['amount']?.toString()); final TextEditingController descController = TextEditingController(text: promo?['description']); final TextEditingController passengerController = TextEditingController(text: promo?['passengerID'] ?? 'none'); final TextEditingController startDateController = TextEditingController(text: promo?['validity_start_date'] ?? DateTime.now().toString().split(' ')[0]); final TextEditingController endDateController = TextEditingController(text: promo?['validity_end_date'] ?? DateTime.now().add(const Duration(days: 30)).toString().split(' ')[0]); Get.bottomSheet( Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: cs.surfaceContainerHighest, borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), ), child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( width: 40, height: 4, decoration: BoxDecoration(color: cs.outline, borderRadius: BorderRadius.circular(2)), ), const SizedBox(height: 24), Text(promo == null ? 'إضافة كود خصم جديد' : 'تعديل كود الخصم', style: GoogleFonts.cairo(fontWeight: FontWeight.bold, color: cs.onSurface, fontSize: 18)), const SizedBox(height: 24), MyTextForm( controller: codeController, label: 'كود الخصم', hint: 'مثال: WELCOME20', type: TextInputType.text, prefixIcon: Icons.local_offer_rounded, ), MyTextForm( controller: amountController, label: 'نسبة الخصم', hint: 'أدخل نسبة الخصم (مثال: 25)', type: TextInputType.number, prefixIcon: Icons.percent_rounded, ), MyTextForm( controller: descController, label: 'الوصف', hint: 'وصف كود الخصم', type: TextInputType.text, prefixIcon: Icons.description_rounded, ), MyTextForm( controller: passengerController, label: 'معرف الراكب (أو none للعام)', hint: 'none', type: TextInputType.text, prefixIcon: Icons.person_rounded, ), Row( children: [ Expanded( child: InkWell( onTap: () async { DateTime? picked = await showDatePicker( context: context, initialDate: DateTime.tryParse(startDateController.text) ?? DateTime.now(), firstDate: DateTime(2020), lastDate: DateTime(2030), ); if (picked != null) { startDateController.text = picked.toString().split(' ')[0]; } }, child: IgnorePointer( child: MyTextForm( controller: startDateController, label: 'يبدأ في', hint: 'YYYY-MM-DD', type: TextInputType.none, prefixIcon: Icons.calendar_today_rounded, ), ), ), ), const SizedBox(width: 12), Expanded( child: InkWell( onTap: () async { DateTime? picked = await showDatePicker( context: context, initialDate: DateTime.tryParse(endDateController.text) ?? DateTime.now(), firstDate: DateTime(2020), lastDate: DateTime(2030), ); if (picked != null) { endDateController.text = picked.toString().split(' ')[0]; } }, child: IgnorePointer( child: MyTextForm( controller: endDateController, label: 'ينتهي في', hint: 'YYYY-MM-DD', type: TextInputType.none, prefixIcon: Icons.event_busy_rounded, ), ), ), ), ], ), const SizedBox(height: 16), MyElevatedButton( title: promo == null ? 'إضافة' : 'حفظ التعديلات', onPressed: () async { final data = { if (promo != null) 'id': promo['id'].toString(), 'promo_code': codeController.text, 'amount': amountController.text, 'description': descController.text, 'passengerID': passengerController.text, 'validity_start_date': startDateController.text, 'validity_end_date': endDateController.text, }; bool success = promo == null ? await controller.addPromo(data) : await controller.updatePromo(data); if (success) Get.back(); }, ), const SizedBox(height: 16), ], ), ), ), isScrollControlled: true, ); } }