import 'package:afterwork/domain/entities/user.dart';
import 'package:afterwork/domain/usecases/get_user.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

/// Bloc pour la gestion des événements et états liés à l'utilisateur.
class UserBloc extends Bloc<UserEvent, UserState> {
  final GetUser getUser;

  /// Constructeur avec injection du cas d'utilisation `GetUser`.
  UserBloc({required this.getUser}) : super(UserInitial());

  @override
  Stream<UserState> mapEventToState(UserEvent event) async* {
    if (event is GetUserById) {
      yield UserLoading();
      final either = await getUser(event.id);

      yield either.fold(
            (failure) => UserError(),
            (user) => UserLoaded(user: user),
      );
    }
  }
}

/// Classe abstraite représentant les événements liés à l'utilisateur.
abstract class UserEvent {}

/// Événement pour récupérer un utilisateur par son ID.
class GetUserById extends UserEvent {
  final String id;

  GetUserById(this.id);
}

/// Classe abstraite représentant les états possibles du BLoC utilisateur.
abstract class UserState {}

/// État initial lorsque rien n'est encore chargé.
class UserInitial extends UserState {}

/// État indiquant que les données utilisateur sont en cours de chargement.
class UserLoading extends UserState {}

/// État indiquant que les données utilisateur ont été chargées avec succès.
class UserLoaded extends UserState {
  final User user;

  UserLoaded({required this.user});
}

/// État indiquant qu'une erreur est survenue lors de la récupération des données utilisateur.
class UserError extends UserState {}
