import 'package:flutter/material.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/widgets/admin/base_user_management.dart'; class AssistanteMaternelleManagementWidget extends StatelessWidget { const AssistanteMaternelleManagementWidget({super.key}); @override Widget build(BuildContext context) { return BaseUserManagementWidget( config: UserDisplayConfig( title: 'Assistantes Maternelles', role: 'assistante_maternelle', defaultIcon: Icons.face, filterFields: [ FilterField( label: 'Rechercher', hint: 'Nom ou email', type: FilterType.text, filter: (user, query) { final fullName = '${user['prenom'] ?? ''} ${user['nom'] ?? ''}'.toLowerCase(); final email = (user['email'] ?? '').toLowerCase(); return fullName.contains(query.toLowerCase()) || email.contains(query.toLowerCase()); }, ), FilterField( label: 'Zone géographique', hint: 'Ville ou département', type: FilterType.text, filter: (user, query) { final zone = (user['zone'] ?? user['ville'] ?? user['code_postal'] ?? '').toLowerCase(); return zone.contains(query.toLowerCase()); }, ), FilterField( label: 'Capacité minimum', hint: 'Nombre d\'enfants', type: FilterType.number, filter: (user, query) { final capacite = int.tryParse(user['capacite']?.toString() ?? '0') ?? 0; final minCapacite = int.tryParse(query) ?? 0; return capacite >= minCapacite; }, ), FilterField( label: 'Statut', hint: 'Tous', type: FilterType.dropdown, options: ['actif', 'en_attente', 'inactif'], filter: (user, status) { if (status.isEmpty) return true; return user['statut']?.toString().toLowerCase() == status.toLowerCase(); }, ), ], actions: [ const UserAction( icon: Icons.edit, color: Colors.orange, tooltip: 'Modifier', onPressed: _editAssistante, ), const UserAction( icon: Icons.delete, color: Colors.red, tooltip: 'Supprimer', onPressed: _deleteAssistante, ), const UserAction( icon: Icons.location_on, color: Colors.green, tooltip: 'Voir zone', onPressed: _showZone, ), ], getSubtitle: (user) { final email = user['email'] ?? ''; final numeroAgrement = user['numeroAgrement'] ?? user['agrement'] ?? 'N/A'; final zone = user['code_postal'] ?? user['ville'] ?? 'Non spécifiée'; final capacite = user['capacite'] ?? user['capaciteAccueil'] ?? 'N/A'; return '$email\nN° Agrément: $numeroAgrement\nZone: $zone | Capacité: $capacite'; }, getDisplayName: (user) => '${user['prenom'] ?? ''} ${user['nom'] ?? ''}', ), ); } static Future _editAssistante(BuildContext context, Map assistante) async { // TODO: Implémenter l'édition ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Fonctionnalité de modification à implémenter'), backgroundColor: Colors.orange, ), ); } static Future _deleteAssistante(BuildContext context, Map assistante) async { final confirmed = await showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Confirmer la suppression'), content: Text( 'Êtes-vous sûr de vouloir supprimer le compte de ${assistante['firstName']} ${assistante['lastName']} ?\n\n' 'Cette action supprimera également tous les contrats et données associés.' ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(false), child: const Text('Annuler'), ), TextButton( onPressed: () => Navigator.of(context).pop(true), style: TextButton.styleFrom(foregroundColor: Colors.red), child: const Text('Supprimer'), ), ], ), ); if (confirmed == true) { try { final userService = UserService(); final success = await userService.deleteUser(assistante['id']); if (success && context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('${assistante['firstName']} ${assistante['lastName']} supprimé avec succès'), backgroundColor: Colors.green, ), ); // Le widget se rechargera automatiquement via le système de state } else { throw Exception('Erreur lors de la suppression'); } } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Erreur: ${e.toString()}'), backgroundColor: Colors.red, ), ); } } } } static Future _showZone(BuildContext context, Map assistante) async { final zone = assistante['zone'] ?? assistante['ville'] ?? 'Non spécifiée'; final adresse = assistante['adresse'] ?? assistante['address'] ?? ''; final codePostal = assistante['codePostal'] ?? assistante['zipCode'] ?? ''; showDialog( context: context, builder: (context) => AlertDialog( title: Text('Zone d\'intervention - ${assistante['firstName']} ${assistante['lastName']}'), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ if (zone.isNotEmpty) Text('Zone: $zone', style: const TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 8), if (adresse.isNotEmpty) Text('Adresse: $adresse'), if (codePostal.isNotEmpty) Text('Code postal: $codePostal'), const SizedBox(height: 16), Text('Capacité d\'accueil: ${assistante['capacite'] ?? assistante['capaciteAccueil'] ?? 'N/A'} enfants'), Text('N° Agrément: ${assistante['numeroAgrement'] ?? assistante['agrement'] ?? 'N/A'}'), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Fermer'), ), TextButton( onPressed: () { // TODO: Ouvrir dans Maps ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Intégration Maps à implémenter'), ), ); }, child: const Text('Voir sur la carte'), ), ], ), ); } } // return Padding( // padding: const EdgeInsets.all(16), // child: Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // // 🔎 Zone de filtre // _buildFilterSection(), // const SizedBox(height: 16), // // 📋 Liste des assistantes // ListView.builder( // shrinkWrap: true, // physics: const NeverScrollableScrollPhysics(), // itemCount: assistantes.length, // itemBuilder: (context, index) { // final assistante = assistantes[index]; // return Card( // margin: const EdgeInsets.symmetric(vertical: 8), // child: ListTile( // leading: const Icon(Icons.face), // title: Text(assistante['nom'].toString()), // subtitle: Text( // "N° Agrément : ${assistante['numeroAgrement']}\nZone : ${assistante['zone']} | Capacité : ${assistante['capacite']}"), // trailing: Row( // mainAxisSize: MainAxisSize.min, // children: [ // IconButton( // icon: const Icon(Icons.edit), // onPressed: () { // // TODO: Ajouter modification // }, // ), // IconButton( // icon: const Icon(Icons.delete), // onPressed: () { // // TODO: Ajouter suppression // }, // ), // ], // ), // ), // ); // }, // ), // ], // ), // ); // } // Widget _buildFilterSection() { // return Wrap( // spacing: 16, // runSpacing: 8, // children: [ // SizedBox( // width: 200, // child: TextField( // decoration: const InputDecoration( // labelText: "Zone géographique", // border: OutlineInputBorder(), // ), // onChanged: (value) { // // TODO: Ajouter logique de filtrage par zone // }, // ), // ), // SizedBox( // width: 200, // child: TextField( // decoration: const InputDecoration( // labelText: "Capacité minimum", // border: OutlineInputBorder(), // ), // keyboardType: TextInputType.number, // onChanged: (value) { // // TODO: Ajouter logique de filtrage par capacité // }, // ), // ), // ], // ); // } // }