import 'package:afterwork/domain/entities/friend.dart';

/// Interface [FriendsRepository] définissant les méthodes pour gérer les amis.
/// Cette interface permet de séparer la logique métier des appels API et de la gestion des données.
/// Elle est implémentée par [FriendsRepositoryImpl], qui contient les détails d'implémentation.
abstract class FriendsRepository {

  /// Récupère la liste paginée des amis pour un utilisateur donné via l'API.
  ///
  /// [userId] : Identifiant unique de l'utilisateur pour lequel récupérer la liste d'amis.
  /// [currentPage] : Indique la page actuelle pour la pagination.
  /// [friendsPerPage] : Nombre d'amis à récupérer par page.
  ///
  /// Retourne une liste d'objets [Friend] correspondant aux amis de l'utilisateur.
  /// En cas d'échec, une liste vide peut être retournée par l'implémentation.
  Future<List<Friend>> fetchFriends(String userId, int currentPage, int friendsPerPage);

  /// Envoie une demande pour ajouter un nouvel ami via l'API.
  ///
  /// [friend] : Objet [Friend] représentant l'ami à ajouter.
  ///
  /// Retourne un `Future<void>`. En cas d'erreur, l'implémentation peut lancer une exception.
  Future<void> addFriend(Friend friend);

  /// Supprime un ami existant via l'API.
  ///
  /// [friendId] : Identifiant unique de l'ami à supprimer.
  ///
  /// Retourne un `Future<void>`. En cas d'erreur, l'implémentation peut lancer une exception.
  Future<void> removeFriend(String friendId);

  /// Récupère les détails d'un ami en utilisant son identifiant `friendId`.
  ///
  /// [userId] : Identifiant unique de l'utilisateur connecté (facultatif selon le contexte).
  /// [friendId] : Identifiant unique de l'ami pour lequel récupérer les détails.
  ///
  /// Retourne un `Future<Friend?>` contenant les informations de l'ami si trouvées,
  /// ou `null` si aucun ami correspondant n'est trouvé ou en cas d'échec.
  Future<Friend?> getFriendDetails(String friendId, String userId);

  /// Met à jour le statut d'un ami dans le système (par exemple, accepter, bloquer).
  ///
  /// [friendId] : Identifiant unique de l'ami.
  /// [status] : Nouveau statut de l'ami sous forme de chaîne de caractères.
  ///
  /// Retourne un `Future<void>`. En cas d'erreur, l'implémentation peut lancer une exception.
  Future<void> updateFriendStatus(String friendId, String status);
}
