import 'package:dartz/dartz.dart';

import '../../core/errors/failures.dart';
import '../../core/utils/app_logger.dart';
import '../entities/user.dart';
import '../repositories/user_repository.dart';

/// Classe qui implémente le cas d'utilisation permettant de récupérer un utilisateur par son ID.
/// Elle interagit avec le dépôt d'utilisateur pour récupérer les données utilisateur.
class GetUser {
  /// Constructeur qui prend en paramètre un dépôt d'utilisateur.
  GetUser(this.repository) {
    AppLogger.d('Initialisation de GetUser avec le UserRepository.', tag: 'GetUser');
  }
  final UserRepository repository;

  /// Méthode pour récupérer un utilisateur par son ID.
  /// Retourne soit un [User], soit une [Failure] en cas d'erreur.
  Future<Either<Failure, User>> call(String id) async {
    AppLogger.d("Appel à GetUser avec l'ID : $id", tag: 'GetUser');

    // Appel au dépôt pour récupérer l'utilisateur
    final result = await repository.getUser(id);

    // Logger le résultat
    result.fold(
      (failure) => AppLogger.e('Erreur lors de la récupération de l\'utilisateur', error: failure, tag: 'GetUser'),
      (user) => AppLogger.d('Utilisateur récupéré avec succès : ${user.userId}', tag: 'GetUser'),
    );

    return result;
  }
}
