import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/relais_model.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/services/relais_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; class GestionnaireManagementWidget extends StatefulWidget { const GestionnaireManagementWidget({Key? key}) : super(key: key); @override State createState() => _GestionnaireManagementWidgetState(); } class _GestionnaireManagementWidgetState extends State { bool _isLoading = false; String? _error; List _gestionnaires = []; List _relais = []; List _filteredGestionnaires = []; final TextEditingController _searchController = TextEditingController(); @override void initState() { super.initState(); _loadGestionnaires(); _searchController.addListener(_onSearchChanged); } @override void dispose() { _searchController.dispose(); super.dispose(); } Future _loadGestionnaires() async { setState(() { _isLoading = true; _error = null; }); try { final gestionnaires = await UserService.getGestionnaires(); List relais = []; try { relais = await RelaisService.getRelais(); } catch (_) { // L'ecran reste utilisable meme si la route Relais n'est pas disponible. } if (!mounted) return; setState(() { _gestionnaires = gestionnaires; _relais = relais; _filteredGestionnaires = gestionnaires; _isLoading = false; }); } catch (e) { if (!mounted) return; setState(() { _error = e.toString(); _isLoading = false; }); } } void _onSearchChanged() { final query = _searchController.text.toLowerCase(); setState(() { _filteredGestionnaires = _gestionnaires.where((u) { final name = u.fullName.toLowerCase(); final email = u.email.toLowerCase(); return name.contains(query) || email.contains(query); }).toList(); }); } Future _openRelaisAssignmentDialog(AppUser user) async { String? selectedRelaisId = user.relaisId; final saved = await showDialog( context: context, builder: (ctx) { return StatefulBuilder( builder: (context, setStateDialog) { return AlertDialog( title: Text( 'Rattacher ${user.fullName.isEmpty ? user.email : user.fullName}', ), content: DropdownButtonFormField( value: selectedRelaisId, isExpanded: true, decoration: const InputDecoration( labelText: 'Relais principal', border: OutlineInputBorder(), ), items: [ const DropdownMenuItem( value: null, child: Text('Aucun relais'), ), ..._relais.map( (relais) => DropdownMenuItem( value: relais.id, child: Text(relais.nom), ), ), ], onChanged: (value) { setStateDialog(() { selectedRelaisId = value; }); }, ), actions: [ TextButton( onPressed: () => Navigator.of(ctx).pop(false), child: const Text('Annuler'), ), FilledButton( onPressed: () => Navigator.of(ctx).pop(true), child: const Text('Enregistrer'), ), ], ); }, ); }, ); if (saved != true) return; try { await UserService.updateGestionnaireRelais( gestionnaireId: user.id, relaisId: selectedRelaisId, ); if (!mounted) return; await _loadGestionnaires(); if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Rattachement relais mis a jour.')), ); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( e.toString().replaceAll('Exception: ', ''), ), backgroundColor: Colors.red.shade600, ), ); } } @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( children: [ Expanded( child: TextField( controller: _searchController, decoration: const InputDecoration( hintText: 'Rechercher un gestionnaire...', prefixIcon: Icon(Icons.search), border: OutlineInputBorder(), ), ), ), const SizedBox(width: 16), ElevatedButton.icon( onPressed: () { // TODO: Rediriger vers la page de creation. }, icon: const Icon(Icons.add), label: const Text('Creer un gestionnaire'), ), ], ), const SizedBox(height: 24), if (_isLoading) const Center(child: CircularProgressIndicator()) else if (_error != null) Center( child: Text( 'Erreur: $_error', style: const TextStyle(color: Colors.red), ), ) else if (_filteredGestionnaires.isEmpty) const Center(child: Text('Aucun gestionnaire trouve.')) else Expanded( child: ListView.builder( itemCount: _filteredGestionnaires.length, itemBuilder: (context, index) { final user = _filteredGestionnaires[index]; return Card( margin: const EdgeInsets.only(bottom: 10), child: ListTile( leading: CircleAvatar( child: Text( (user.prenom?.isNotEmpty == true ? user.prenom!.substring(0, 1) : user.email.substring(0, 1)) .toUpperCase(), ), ), title: Text( user.fullName.isNotEmpty ? user.fullName : 'Sans nom', ), subtitle: Text( '${user.email} • Relais: ${user.relaisNom ?? 'Non rattache'}', ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: const Icon(Icons.location_city_outlined), tooltip: 'Rattacher un relais', onPressed: () => _openRelaisAssignmentDialog(user), ), IconButton( icon: const Icon(Icons.edit), tooltip: 'Modifier', onPressed: () { // TODO: Modifier gestionnaire. }, ), ], ), ), ); }, ), ), ], ), ); } }