import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/models/parent_model.dart'; import 'package:p_tits_pas/models/assistante_maternelle_model.dart'; import 'package:p_tits_pas/services/api/api_config.dart'; import 'package:p_tits_pas/services/api/tokenService.dart'; class UserService { static Future> _headers() async { final token = await TokenService.getToken(); return token != null ? ApiConfig.authHeaders(token) : Map.from(ApiConfig.headers); } static String? _toStr(dynamic v) { if (v == null) return null; if (v is String) return v; return v.toString(); } // Récupérer la liste des gestionnaires (endpoint dédié) static Future> getGestionnaires() async { final response = await http.get( Uri.parse('${ApiConfig.baseUrl}${ApiConfig.gestionnaires}'), headers: await _headers(), ); if (response.statusCode != 200) { final err = jsonDecode(response.body) as Map?; throw Exception( _toStr(err?['message']) ?? 'Erreur chargement gestionnaires'); } final List data = jsonDecode(response.body); return data.map((e) => AppUser.fromJson(e)).toList(); } // Récupérer la liste des parents static Future> getParents() async { final response = await http.get( Uri.parse('${ApiConfig.baseUrl}${ApiConfig.parents}'), headers: await _headers(), ); if (response.statusCode != 200) { final err = jsonDecode(response.body) as Map?; throw Exception(_toStr(err?['message']) ?? 'Erreur chargement parents'); } final List data = jsonDecode(response.body); return data.map((e) => ParentModel.fromJson(e)).toList(); } // Récupérer la liste des assistantes maternelles static Future> getAssistantesMaternelles() async { final response = await http.get( Uri.parse('${ApiConfig.baseUrl}${ApiConfig.assistantesMaternelles}'), headers: await _headers(), ); if (response.statusCode != 200) { final err = jsonDecode(response.body) as Map?; throw Exception(_toStr(err?['message']) ?? 'Erreur chargement AM'); } final List data = jsonDecode(response.body); return data.map((e) => AssistanteMaternelleModel.fromJson(e)).toList(); } // Récupérer la liste des administrateurs (via /users filtré ou autre) // Pour l'instant on va utiliser /users et filtrer côté client si on est super admin static Future> getAdministrateurs() async { // TODO: Endpoint dédié ou filtrage // En attendant, on retourne une liste vide ou on tente /users try { final response = await http.get( Uri.parse('${ApiConfig.baseUrl}${ApiConfig.users}'), headers: await _headers(), ); if (response.statusCode == 200) { final List data = jsonDecode(response.body); return data .map((e) => AppUser.fromJson(e)) .where((u) => u.role == 'administrateur' || u.role == 'super_admin') .toList(); } } catch (e) { // On garde un fallback vide pour ne pas bloquer l'UI admin. } return []; } static Future updateGestionnaireRelais({ required String gestionnaireId, required String? relaisId, }) async { final response = await http.patch( Uri.parse( '${ApiConfig.baseUrl}${ApiConfig.gestionnaires}/$gestionnaireId'), headers: await _headers(), body: jsonEncode({'relaisId': relaisId}), ); if (response.statusCode != 200 && response.statusCode != 204) { final err = jsonDecode(response.body) as Map?; throw Exception( _toStr(err?['message']) ?? 'Erreur rattachement relais au gestionnaire', ); } } }