import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:em2rp/models/user_model.dart';
import 'package:em2rp/services/data_service.dart';
import 'package:em2rp/services/api_service.dart';

class UsersProvider with ChangeNotifier {
  final DataService _dataService = DataService(FirebaseFunctionsApiService());
  List<UserModel> _users = [];
  bool _isLoading = false;

  List<UserModel> get users => _users;
  bool get isLoading => _isLoading;

  /// Récupération de tous les utilisateurs via l'API
  Future<void> fetchUsers() async {
    _isLoading = true;
    notifyListeners();

    try {
      final usersData = await _dataService.getUsers();
      _users = usersData.map((data) {
        return UserModel.fromMap(data, data['id'] as String);
      }).toList();
    } catch (e) {
      print('Error fetching users: $e');
      _users = [];
    }

    _isLoading = false;
    notifyListeners();
  }

  /// Recharger les utilisateurs
  Future<void> refresh() async {
    await fetchUsers();
  }

  /// Obtenir un utilisateur par ID
  UserModel? getUserById(String uid) {
    try {
      return _users.firstWhere((u) => u.uid == uid);
    } catch (e) {
      return null;
    }
  }

  /// Mettre à jour un utilisateur
  Future<void> updateUser(UserModel user) async {
    try {
      await _dataService.updateUser(user.uid, user.toMap());

      final index = _users.indexWhere((u) => u.uid == user.uid);
      if (index != -1) {
        _users[index] = user;
        notifyListeners();
      }
    } catch (e) {
      print('Error updating user: $e');
      rethrow;
    }
  }

  /// Suppression d'un utilisateur via Cloud Function
  Future<void> deleteUser(String uid) async {
    try {
      await _dataService.deleteUser(uid);
      _users.removeWhere((user) => user.uid == uid);
      notifyListeners();
    } catch (e) {
      print('Error deleting user: $e');
      rethrow;
    }
  }

  /// Créer un utilisateur avec invitation par email
  Future<void> createUserWithEmailInvite({
    required String email,
    required String firstName,
    required String lastName,
    String? phoneNumber,
    required String roleId,
  }) async {
    try {
      print('Creating user with email invite: $email');

      // Appeler la Cloud Function pour créer l'utilisateur
      await _dataService.createUserWithInvite(
        email: email,
        firstName: firstName,
        lastName: lastName,
        phoneNumber: phoneNumber,
        roleId: roleId,
      );

      // Recharger la liste des utilisateurs
      await fetchUsers();

      print('User created successfully: $email');
    } catch (e) {
      print('Error creating user with email invite: $e');
      rethrow;
    }
  }

  /// Réinitialisation du mot de passe
  Future<void> resetPassword(String email) async {
    try {
      // Firebase Auth reste OK (ce n'est pas Firestore)
      await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
      print('Email de réinitialisation envoyé à $email');
    } catch (e) {
      print('Error reset password: $e');
      rethrow;
    }
  }
}
