/// Interface du repository des événements (Clean Architecture)
library evenement_repository_interface;

import '../../data/repositories/evenement_repository_impl.dart' show EvenementSearchResult;
import '../../data/models/evenement_model.dart';

/// Interface définissant le contrat du repository des événements
/// Implémentée par EvenementRepositoryImpl dans la couche data
abstract class IEvenementRepository {
  /// Récupère la liste des événements avec pagination
  Future<EvenementSearchResult> getEvenements({
    int page = 0,
    int size = 20,
    String? recherche,
  });

  /// Récupère un événement par son ID
  Future<EvenementModel?> getEvenementById(String id);

  /// Crée un nouvel événement
  Future<EvenementModel> createEvenement(EvenementModel evenement);

  /// Met à jour un événement
  Future<EvenementModel> updateEvenement(String id, EvenementModel evenement);

  /// Supprime un événement
  Future<void> deleteEvenement(String id);

  /// Récupère les événements à venir
  Future<EvenementSearchResult> getEvenementsAVenir({int page = 0, int size = 20});

  /// Récupère les événements en cours
  Future<EvenementSearchResult> getEvenementsEnCours({int page = 0, int size = 20});

  /// Récupère les événements passés
  Future<EvenementSearchResult> getEvenementsPasses({int page = 0, int size = 20});

  /// S'inscrire à un événement
  Future<void> inscrireEvenement(String evenementId);

  /// Se désinscrire d'un événement
  Future<void> desinscrireEvenement(String evenementId);

  /// Indique si l'utilisateur connecté est inscrit à l'événement
  Future<bool> getInscriptionStatus(String evenementId);

  /// Récupère les participants d'un événement
  Future<List<Map<String, dynamic>>> getParticipants(String evenementId);

  /// Récupère les statistiques des événements
  Future<Map<String, dynamic>> getEvenementsStats();

  /// Soumet un feedback pour un événement
  Future<void> submitFeedback({
    required String evenementId,
    required int note,
    String? commentaire,
  });

  /// Récupère les feedbacks d'un événement
  Future<Map<String, dynamic>> getFeedbacks(String evenementId);
}
