import 'package:em2rp/services/api_service.dart';

/// Repository pour gérer toutes les opérations sur les utilisateurs et les rôles.
class UserRepository {
  final ApiService _apiService;

  UserRepository(this._apiService);

  /// Récupère l'utilisateur actuellement authentifié avec son rôle
  Future<Map<String, dynamic>> getCurrentUser() async {
    try {
      print('[UserRepository] Calling getCurrentUser API...');
      final result = await _apiService.call('getCurrentUser', {});
      print('[UserRepository] Current user loaded successfully');
      return result['user'] as Map<String, dynamic>;
    } catch (e) {
      print('[UserRepository] Error getting current user: $e');
      throw Exception(
          'Erreur lors de la récupération de l\'utilisateur actuel: $e');
    }
  }

  /// Récupère tous les utilisateurs (selon permissions)
  Future<List<Map<String, dynamic>>> getUsers() async {
    try {
      final result = await _apiService.call('getUsers', {});
      final users = result['users'] as List<dynamic>?;
      if (users == null) return [];
      return users.map((e) => e as Map<String, dynamic>).toList();
    } catch (e) {
      throw Exception('Erreur lors de la récupération des utilisateurs: $e');
    }
  }

  /// Récupère un utilisateur spécifique
  Future<Map<String, dynamic>> getUser(String userId) async {
    try {
      final result = await _apiService.call('getUser', {'userId': userId});
      return result['user'] as Map<String, dynamic>;
    } catch (e) {
      throw Exception('Erreur lors de la récupération de l\'utilisateur: $e');
    }
  }

  /// Supprime un utilisateur (Auth + Firestore)
  Future<void> deleteUser(String userId) async {
    try {
      await _apiService.call('deleteUser', {'userId': userId});
    } catch (e) {
      throw Exception('Erreur lors de la suppression de l\'utilisateur: $e');
    }
  }

  /// Met à jour un utilisateur
  Future<void> updateUser(String userId, Map<String, dynamic> data) async {
    try {
      await _apiService.call('updateUser', {
        'userId': userId,
        'data': data,
      });
    } catch (e) {
      throw Exception('Erreur lors de la mise à jour de l\'utilisateur: $e');
    }
  }

  /// Crée un utilisateur avec invitation par email
  Future<Map<String, dynamic>> createUserWithInvite({
    required String email,
    required String firstName,
    required String lastName,
    String? phoneNumber,
    required String roleId,
  }) async {
    try {
      final result = await _apiService.call('createUserWithInvite', {
        'email': email,
        'firstName': firstName,
        'lastName': lastName,
        'phoneNumber': phoneNumber ?? '',
        'roleId': roleId,
      });
      return result;
    } catch (e) {
      throw Exception('Erreur lors de la création de l\'utilisateur: $e');
    }
  }

  /// Récupère tous les rôles
  Future<List<Map<String, dynamic>>> getRoles() async {
    try {
      final result = await _apiService.call('getRoles', {});
      final roles = result['roles'] as List<dynamic>?;
      if (roles == null) return [];
      return roles.map((e) => e as Map<String, dynamic>).toList();
    } catch (e) {
      throw Exception('Erreur lors de la récupération des rôles: $e');
    }
  }
}
