import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/screens/administrateurs/creation/gestionnaires_create.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; class GestionnaireManagementWidget extends StatefulWidget { final String searchQuery; const GestionnaireManagementWidget({ Key? key, required this.searchQuery, }) : super(key: key); @override State createState() => _GestionnaireManagementWidgetState(); } class _GestionnaireManagementWidgetState extends State { bool _isLoading = false; String? _error; List _gestionnaires = []; bool _canDelete = false; String? _currentUserId; @override void initState() { super.initState(); _loadRights(); _loadGestionnaires(); } @override void dispose() => super.dispose(); Future _loadRights() async { final user = await AuthService.getCurrentUser(); if (!mounted) return; setState(() { _canDelete = canDeleteGestionnaire(user?.role); _currentUserId = user?.id; }); } Future _loadGestionnaires() async { setState(() { _isLoading = true; _error = null; }); try { final gestionnaires = await UserService.getGestionnaires(); if (!mounted) return; setState(() { _gestionnaires = gestionnaires; _isLoading = false; }); } catch (e) { if (!mounted) return; setState(() { _error = e.toString(); _isLoading = false; }); } } Future _openGestionnaireEditDialog(AppUser user) async { final changed = await showDialog( context: context, barrierDismissible: false, builder: (dialogContext) { return AdminUserFormDialog(initialUser: user); }, ); if (changed == true) { await _loadGestionnaires(); } } Future _confirmDelete(AppUser user) async { if (_currentUserId != null && _currentUserId == user.id) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Vous ne pouvez pas supprimer votre propre compte.'), ), ); return; } final name = user.fullName.isNotEmpty ? user.fullName : user.email; final confirmed = await showSuppressionConfirmDialog( context, title: 'Supprimer le gestionnaire', people: [SuppressionPersonLine.gestionnaire(name)], footnotes: const [ 'Le compte sera définitivement supprimé.', ], ); if (!confirmed || !mounted) return; try { final result = await UserService.deleteUser(user.id); if (!mounted) return; final msg = (result['message'] ?? 'Gestionnaire supprimé.').toString(); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg))); await _loadGestionnaires(); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( e is Exception ? e.toString().replaceFirst('Exception: ', '') : 'Erreur suppression', ), ), ); } } @override Widget build(BuildContext context) { final query = widget.searchQuery.toLowerCase(); final filteredGestionnaires = _gestionnaires.where((u) { final name = u.fullName.toLowerCase(); final email = u.email.toLowerCase(); return name.contains(query) || email.contains(query); }).toList(); return UserList( isLoading: _isLoading, error: _error, isEmpty: filteredGestionnaires.isEmpty, emptyMessage: 'Aucun gestionnaire trouvé.', itemCount: filteredGestionnaires.length, itemBuilder: (context, index) { final user = filteredGestionnaires[index]; final isSelf = _currentUserId != null && _currentUserId == user.id; return AdminUserCard( title: user.fullName, fallbackIcon: Icons.assignment_ind_outlined, avatarUrl: user.photoUrl, onCardTap: () => _openGestionnaireEditDialog(user), subtitleLines: [ user.email, 'Statut : ${user.statut ?? 'Inconnu'}', 'Relais : ${user.relaisNom ?? 'Non rattaché'}', ], actions: [ IconButton( icon: const Icon(Icons.edit), tooltip: 'Modifier', onPressed: () { _openGestionnaireEditDialog(user); }, ), if (_canDelete && !isSelf) suppressionIconButton(onPressed: () => _confirmDelete(user)), ], ); }, ); } }