/// Événements pour le BLoC des membres
library membres_event;

import 'package:equatable/equatable.dart';
import '../data/models/membre_complete_model.dart';
import '../../../shared/models/membre_search_criteria.dart';

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

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

/// Événement pour charger la liste des membres
class LoadMembres extends MembresEvent {
  final int page;
  final int size;
  final String? recherche;
  final bool refresh;
  final String? organisationId;

  const LoadMembres({
    this.page = 0,
    this.size = 20,
    this.recherche,
    this.refresh = false,
    this.organisationId,
  });

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

/// Événement pour charger un membre par ID
class LoadMembreById extends MembresEvent {
  final String id;

  const LoadMembreById(this.id);

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

/// Événement pour créer un nouveau membre
class CreateMembre extends MembresEvent {
  final MembreCompletModel membre;

  const CreateMembre(this.membre);

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

/// Événement pour mettre à jour un membre
class UpdateMembre extends MembresEvent {
  final String id;
  final MembreCompletModel membre;

  const UpdateMembre(this.id, this.membre);

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

/// Événement pour supprimer un membre
class DeleteMembre extends MembresEvent {
  final String id;

  const DeleteMembre(this.id);

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

/// Événement pour activer un membre
class ActivateMembre extends MembresEvent {
  final String id;

  const ActivateMembre(this.id);

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

/// Événement pour désactiver un membre
class DeactivateMembre extends MembresEvent {
  final String id;

  const DeactivateMembre(this.id);

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

/// Événement pour recherche avancée
class SearchMembres extends MembresEvent {
  final MembreSearchCriteria criteria;
  final int page;
  final int size;

  const SearchMembres({
    required this.criteria,
    this.page = 0,
    this.size = 20,
  });

  @override
  List<Object?> get props => [criteria, page, size];
}

/// Événement pour charger les membres actifs
class LoadActiveMembres extends MembresEvent {
  final int page;
  final int size;

  const LoadActiveMembres({
    this.page = 0,
    this.size = 20,
  });

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

/// Événement pour charger les membres du bureau
class LoadBureauMembres extends MembresEvent {
  final int page;
  final int size;

  const LoadBureauMembres({
    this.page = 0,
    this.size = 20,
  });

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

/// Événement pour charger les statistiques
class LoadMembresStats extends MembresEvent {
  const LoadMembresStats();
}

/// Événement pour réinitialiser le mot de passe d'un membre existant
class ResetMotDePasse extends MembresEvent {
  final String id;

  const ResetMotDePasse(this.id);

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

/// Événement pour affecter un membre à une organisation (superadmin)
class AffecterOrganisation extends MembresEvent {
  final String membreId;
  final String organisationId;

  const AffecterOrganisation(this.membreId, this.organisationId);

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

// ── Cycle de vie des adhésions ────────────────────────────────────────────

/// Inviter un membre dans une organisation (admin)
class InviterMembre extends MembresEvent {
  final String membreId;
  final String organisationId;
  final String? roleOrg;

  const InviterMembre({
    required this.membreId,
    required this.organisationId,
    this.roleOrg,
  });

  @override
  List<Object?> get props => [membreId, organisationId, roleOrg];
}

/// Activer l'adhésion d'un membre dans l'organisation courante
class ActiverAdhesion extends MembresEvent {
  final String membreId;
  final String organisationId;
  final String? motif;

  const ActiverAdhesion({
    required this.membreId,
    required this.organisationId,
    this.motif,
  });

  @override
  List<Object?> get props => [membreId, organisationId, motif];
}

/// Suspendre l'adhésion d'un membre
class SuspendrAdhesion extends MembresEvent {
  final String membreId;
  final String organisationId;
  final String? motif;

  const SuspendrAdhesion({
    required this.membreId,
    required this.organisationId,
    this.motif,
  });

  @override
  List<Object?> get props => [membreId, organisationId, motif];
}

/// Radier un membre d'une organisation
class RadierAdhesion extends MembresEvent {
  final String membreId;
  final String organisationId;
  final String? motif;

  const RadierAdhesion({
    required this.membreId,
    required this.organisationId,
    this.motif,
  });

  @override
  List<Object?> get props => [membreId, organisationId, motif];
}

