/// Événements pour le BLoC des organisations
library organizations_event;

import 'package:equatable/equatable.dart';
import '../data/models/organization_model.dart';

/// Classe de base pour tous les événements des organisations
abstract class OrganizationsEvent extends Equatable {
  const OrganizationsEvent();

  @override
  List<Object?> get props => [];
}

/// Événement pour charger la liste des organisations
class LoadOrganizations extends OrganizationsEvent {
  final int page;
  final int size;
  final String? recherche;
  final bool refresh;
  /// Filtre par IDs d'organisations (ex. pour orgAdmin : uniquement son organisation)
  final List<String>? filterOrganizationIds;
  /// Si true, appelle GET /api/organisations/mes (uniquement les orgs du membre connecté)
  final bool useMesOnly;

  const LoadOrganizations({
    this.page = 0,
    this.size = 20,
    this.recherche,
    this.refresh = false,
    this.filterOrganizationIds,
    this.useMesOnly = false,
  });

  @override
  List<Object?> get props => [page, size, recherche, refresh, filterOrganizationIds, useMesOnly];
}

/// Événement pour charger plus d'organisations (pagination)
class LoadMoreOrganizations extends OrganizationsEvent {
  const LoadMoreOrganizations();
}

/// Événement pour rechercher des organisations
class SearchOrganizations extends OrganizationsEvent {
  final String query;

  const SearchOrganizations(this.query);

  @override
  List<Object?> get props => [query];
}

/// Événement pour recherche avancée
class AdvancedSearchOrganizations extends OrganizationsEvent {
  final String? nom;
  final String? type;
  final StatutOrganization? statut;
  final String? ville;
  final String? region;
  final String? pays;
  final int page;
  final int size;

  const AdvancedSearchOrganizations({
    this.nom,
    this.type,
    this.statut,
    this.ville,
    this.region,
    this.pays,
    this.page = 0,
    this.size = 20,
  });

  @override
  List<Object?> get props => [nom, type, statut, ville, region, pays, page, size];
}

/// Événement pour charger une organisation spécifique
class LoadOrganizationById extends OrganizationsEvent {
  final String id;

  const LoadOrganizationById(this.id);

  @override
  List<Object?> get props => [id];
}

/// Événement pour créer une nouvelle organisation
class CreateOrganization extends OrganizationsEvent {
  final OrganizationModel organization;

  const CreateOrganization(this.organization);

  @override
  List<Object?> get props => [organization];
}

/// Événement pour mettre à jour une organisation
class UpdateOrganization extends OrganizationsEvent {
  final String id;
  final OrganizationModel organization;

  const UpdateOrganization(this.id, this.organization);

  @override
  List<Object?> get props => [id, organization];
}

/// Événement pour supprimer une organisation
class DeleteOrganization extends OrganizationsEvent {
  final String id;

  const DeleteOrganization(this.id);

  @override
  List<Object?> get props => [id];
}

/// Événement pour activer une organisation
class ActivateOrganization extends OrganizationsEvent {
  final String id;

  const ActivateOrganization(this.id);

  @override
  List<Object?> get props => [id];
}

/// Événement pour suspendre une organisation
class SuspendOrganization extends OrganizationsEvent {
  final String id;

  const SuspendOrganization(this.id);

  @override
  List<Object?> get props => [id];
}

/// Événement pour filtrer les organisations par statut
class FilterOrganizationsByStatus extends OrganizationsEvent {
  final StatutOrganization? statut;

  const FilterOrganizationsByStatus(this.statut);

  @override
  List<Object?> get props => [statut];
}

/// Événement pour filtrer les organisations par type
class FilterOrganizationsByType extends OrganizationsEvent {
  final String? type;

  const FilterOrganizationsByType(this.type);

  @override
  List<Object?> get props => [type];
}

/// Événement pour trier les organisations
class SortOrganizations extends OrganizationsEvent {
  final OrganizationSortType sortType;
  final bool ascending;

  const SortOrganizations(this.sortType, {this.ascending = true});

  @override
  List<Object?> get props => [sortType, ascending];
}

/// Événement pour charger les statistiques des organisations
class LoadOrganizationsStats extends OrganizationsEvent {
  const LoadOrganizationsStats();
}

/// Événement pour effacer les filtres
class ClearOrganizationsFilters extends OrganizationsEvent {
  const ClearOrganizationsFilters();
}

/// Événement pour rafraîchir les données
class RefreshOrganizations extends OrganizationsEvent {
  const RefreshOrganizations();
}

/// Événement pour réinitialiser l'état
class ResetOrganizationsState extends OrganizationsEvent {
  const ResetOrganizationsState();
}


