import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:youmazgestion/Models/Remise.dart'; import 'package:youmazgestion/Models/produit.dart'; import 'package:youmazgestion/Services/stock_managementDatabase.dart'; class GiftSelectionDialog extends StatefulWidget { const GiftSelectionDialog({super.key}); @override _GiftSelectionDialogState createState() => _GiftSelectionDialogState(); } class _GiftSelectionDialogState extends State { final AppDatabase _database = AppDatabase.instance; final _searchController = TextEditingController(); List _products = []; List _filteredProducts = []; bool _isLoading = true; String? _selectedCategory; @override void initState() { super.initState(); _loadProducts(); _searchController.addListener(_filterProducts); } @override void dispose() { _searchController.dispose(); super.dispose(); } Future _loadProducts() async { try { final products = await _database.getProducts(); setState(() { _products = products.where((p) => p.stock > 0).toList(); // Seulement les produits en stock _filteredProducts = _products; _isLoading = false; }); } catch (e) { setState(() => _isLoading = false); Get.snackbar( 'Erreur', 'Impossible de charger les produits', snackPosition: SnackPosition.BOTTOM, backgroundColor: Colors.red, colorText: Colors.white, ); } } void _filterProducts() { final query = _searchController.text.toLowerCase(); setState(() { _filteredProducts = _products.where((product) { final matchesSearch = product.name.toLowerCase().contains(query) || (product.reference?.toLowerCase().contains(query) ?? false) || (product.imei?.toLowerCase().contains(query) ?? false); final matchesCategory = _selectedCategory == null || product.category == _selectedCategory; return matchesSearch && matchesCategory; }).toList(); }); } void _selectGift(Product product) { showDialog( context: context, builder: (context) => AlertDialog( title: Row( children: [ Icon(Icons.card_giftcard, color: Colors.purple.shade600), const SizedBox(width: 8), const Text('Confirmer le cadeau'), ], ), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('Produit sélectionné:', style: TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 8), Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.purple.shade50, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.purple.shade200), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( product.name, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), if (product.reference != null && product.reference!.isNotEmpty) Text('Référence: ${product.reference}'), if (product.category.isNotEmpty) Text('Catégorie: ${product.category}'), Text('Prix normal: ${product.price.toStringAsFixed(0)} MGA'), Text('Stock disponible: ${product.stock}'), ], ), ), const SizedBox(height: 16), const Text( 'Ce produit sera ajouté à la commande avec un prix de 0 MGA.', style: TextStyle(fontSize: 14, color: Colors.grey), ), ], ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.pop(context); // Fermer ce dialogue Navigator.pop(context, ProduitCadeau(produit: product)); // Retourner le produit }, style: ElevatedButton.styleFrom( backgroundColor: Colors.purple.shade600, foregroundColor: Colors.white, ), child: const Text('Confirmer le cadeau'), ), ], ), ); } @override Widget build(BuildContext context) { final categories = _products.map((p) => p.category).toSet().toList()..sort(); return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), child: Container( width: MediaQuery.of(context).size.width * 0.9, height: MediaQuery.of(context).size.height * 0.8, padding: const EdgeInsets.all(20), child: Column( children: [ // En-tête Row( children: [ Icon(Icons.card_giftcard, color: Colors.purple.shade600, size: 28), const SizedBox(width: 12), const Expanded( child: Text( 'Choisir un cadeau', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), ), IconButton( onPressed: () => Navigator.pop(context), icon: const Icon(Icons.close), ), ], ), const SizedBox(height: 16), // Barre de recherche TextField( controller: _searchController, decoration: InputDecoration( labelText: 'Rechercher un produit', prefixIcon: const Icon(Icons.search), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), ), ), const SizedBox(height: 12), // Filtre par catégorie Container( height: 50, child: ListView( scrollDirection: Axis.horizontal, children: [ FilterChip( label: const Text('Toutes'), selected: _selectedCategory == null, onSelected: (selected) { setState(() { _selectedCategory = null; _filterProducts(); }); }, ), const SizedBox(width: 8), ...categories.map((category) => Padding( padding: const EdgeInsets.only(right: 8), child: FilterChip( label: Text(category), selected: _selectedCategory == category, onSelected: (selected) { setState(() { _selectedCategory = selected ? category : null; _filterProducts(); }); }, ), )), ], ), ), const SizedBox(height: 16), // Liste des produits Expanded( child: _isLoading ? const Center(child: CircularProgressIndicator()) : _filteredProducts.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.inventory_2_outlined, size: 64, color: Colors.grey.shade400, ), const SizedBox(height: 16), Text( 'Aucun produit disponible', style: TextStyle( fontSize: 18, color: Colors.grey.shade600, ), ), const SizedBox(height: 8), Text( 'Essayez de modifier vos critères de recherche', style: TextStyle( fontSize: 14, color: Colors.grey.shade500, ), ), ], ), ) : ListView.builder( itemCount: _filteredProducts.length, itemBuilder: (context, index) { final product = _filteredProducts[index]; return Card( margin: const EdgeInsets.only(bottom: 8), elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), child: ListTile( contentPadding: const EdgeInsets.all(12), leading: Container( width: 60, height: 60, decoration: BoxDecoration( color: Colors.purple.shade50, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.purple.shade200), ), child: product.image != null && product.image!.isNotEmpty ? ClipRRect( borderRadius: BorderRadius.circular(8), child: Image.network( product.image!, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) => Icon(Icons.image_not_supported, color: Colors.purple.shade300), ), ) : Icon(Icons.card_giftcard, color: Colors.purple.shade400, size: 30), ), title: Text( product.name, style: const TextStyle(fontWeight: FontWeight.bold), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (product.reference != null && product.reference!.isNotEmpty) Text('Ref: ${product.reference}'), Text('Catégorie: ${product.category}'), Text( 'Prix: ${product.price.toStringAsFixed(0)} MGA', style: TextStyle( color: Colors.green.shade600, fontWeight: FontWeight.w600, ), ), ], ), trailing: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: Colors.green.shade100, borderRadius: BorderRadius.circular(12), ), child: Text( 'Stock: ${product.stock}', style: TextStyle( fontSize: 12, color: Colors.green.shade700, fontWeight: FontWeight.w600, ), ), ), const SizedBox(height: 8), ElevatedButton( onPressed: () => _selectGift(product), style: ElevatedButton.styleFrom( backgroundColor: Colors.purple.shade600, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text('Choisir', style: TextStyle(fontSize: 12)), ), ], ), onTap: () => _selectGift(product), ), ); }, ), ), ], ), ), ); } }