/// Interface du repository des organisations (Clean Architecture - Domain Layer)
library organization_repository;

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

/// Interface du repository pour la gestion des organisations
/// Contrat défini dans la couche Domain, implémenté dans la couche Data
abstract class IOrganizationRepository {
  /// Récupère la liste des organisations avec pagination
  Future<List<OrganizationModel>> getOrganizations({
    int page = 0,
    int size = 20,
    String? recherche,
  });

  /// Récupère les organisations du membre connecté (pour OrgAdmin)
  Future<List<OrganizationModel>> getMesOrganisations();

  /// Récupère une organisation par son ID
  Future<OrganizationModel?> getOrganizationById(String id);

  /// Crée une nouvelle organisation (SuperAdmin)
  Future<OrganizationModel> createOrganization(OrganizationModel organization);

  /// Met à jour une organisation (OrgAdmin)
  Future<OrganizationModel> updateOrganization(String id, OrganizationModel organization);

  /// Supprime une organisation (SuperAdmin)
  Future<void> deleteOrganization(String id);

  /// Active une organisation
  Future<OrganizationModel> activateOrganization(String id);

  /// Suspend une organisation
  Future<OrganizationModel> suspendOrganization(String id);

  /// Recherche avancée d'organisations
  Future<List<OrganizationModel>> searchOrganizations({
    String? nom,
    String? type,
    StatutOrganization? statut,
    String? ville,
    String? region,
    String? pays,
    int page = 0,
    int size = 20,
  });

  /// Récupère les membres d'une organisation (GET /api/organisations/{id}/membres)
  Future<List<Map<String, dynamic>>> getOrganizationMembers(String organizationId);

  /// Met à jour la configuration d'une organisation (PUT /api/organisations/{id}/configuration)
  /// Configuration: logo, couleurs, préférences, modules activés, etc.
  Future<OrganizationModel> updateOrganizationConfig(
    String id,
    Map<String, dynamic> config,
  );

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

  /// Retourne le nombre réel de membres actifs d'une organisation.
  Future<int> getMembreCount(String organizationId);
}
