/// Interface du repository des rapports (Clean Architecture - Domain Layer)
library reports_repository;

import '../../data/models/analytics_model.dart';

/// Interface du repository pour la gestion des rapports et analytics
/// Contrat défini dans la couche Domain, implémenté dans la couche Data
abstract class IReportsRepository {
  /// Récupère les métriques d'analyse
  Future<List<AnalyticsModel>> getMetriques(String typeMetrique, String periode);

  /// Récupère la performance globale
  Future<Map<String, dynamic>> getPerformanceGlobale();

  /// Récupère les évolutions d'une métrique
  Future<List<AnalyticsModel>> getEvolutions(String typeMetrique);

  /// Récupère les statistiques des membres
  Future<Map<String, dynamic>> getStatistiquesMembres();

  /// Récupère les statistiques des cotisations pour une année
  Future<Map<String, dynamic>> getStatistiquesCotisations(int annee);

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

  /// Liste les rapports disponibles (types de rapports générables)
  /// Endpoint: GET /api/v1/analytics/reports/available
  Future<List<Map<String, dynamic>>> getAvailableReports();

  /// Génère un rapport (générique, sans format spécifique)
  /// Endpoint: POST /api/v1/analytics/reports/generate
  Future<void> generateReport(String type, {String? format});

  /// Exporte un rapport au format PDF
  /// Wrapper de generateReport avec format='pdf'
  Future<String> exportReportPdf(String type);

  /// Exporte un rapport au format Excel/CSV
  /// Wrapper de generateReport avec format='excel' ou 'csv'
  Future<String> exportReportExcel(String type, {String format = 'excel'});

  /// Programme un rapport automatique (avec expression cron)
  /// Endpoint: POST /api/v1/analytics/reports/schedule
  Future<void> scheduleReport({String? cronExpression});

  /// Récupère la liste des rapports programmés
  /// Endpoint: GET /api/v1/analytics/reports/scheduled
  Future<List<Map<String, dynamic>>> getScheduledReports();
}
