/// États pour le BLoC des événements
library evenements_state;

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

/// Classe de base pour tous les états
abstract class EvenementsState extends Equatable {
  const EvenementsState();

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

/// État initial
class EvenementsInitial extends EvenementsState {
  const EvenementsInitial();
}

/// État de chargement
class EvenementsLoading extends EvenementsState {
  const EvenementsLoading();
}

/// État de chargement avec données existantes (pour refresh)
class EvenementsRefreshing extends EvenementsState {
  final List<EvenementModel> currentEvenements;

  const EvenementsRefreshing(this.currentEvenements);

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

/// État de succès avec liste d'événements
class EvenementsLoaded extends EvenementsState {
  final List<EvenementModel> evenements;
  final int total;
  final int page;
  final int size;
  final int totalPages;
  final bool hasMore;

  const EvenementsLoaded({
    required this.evenements,
    required this.total,
    this.page = 0,
    this.size = 20,
    required this.totalPages,
  }) : hasMore = page < totalPages - 1;

  @override
  List<Object?> get props => [evenements, total, page, size, totalPages, hasMore];

  EvenementsLoaded copyWith({
    List<EvenementModel>? evenements,
    int? total,
    int? page,
    int? size,
    int? totalPages,
  }) {
    return EvenementsLoaded(
      evenements: evenements ?? this.evenements,
      total: total ?? this.total,
      page: page ?? this.page,
      size: size ?? this.size,
      totalPages: totalPages ?? this.totalPages,
    );
  }
}

/// État de succès avec un seul événement
class EvenementDetailLoaded extends EvenementsState {
  final EvenementModel evenement;

  const EvenementDetailLoaded(this.evenement);

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

/// État de succès après création
class EvenementCreated extends EvenementsState {
  final EvenementModel evenement;

  const EvenementCreated(this.evenement);

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

/// État de succès après mise à jour
class EvenementUpdated extends EvenementsState {
  final EvenementModel evenement;

  const EvenementUpdated(this.evenement);

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

/// État de succès après suppression
class EvenementDeleted extends EvenementsState {
  final String id;

  const EvenementDeleted(this.id);

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

/// État de succès après inscription
class EvenementInscrit extends EvenementsState {
  final String evenementId;

  const EvenementInscrit(this.evenementId);

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

/// État de succès après désinscription
class EvenementDesinscrit extends EvenementsState {
  final String evenementId;

  const EvenementDesinscrit(this.evenementId);

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

/// État avec liste de participants
class ParticipantsLoaded extends EvenementsState {
  final String evenementId;
  final List<Map<String, dynamic>> participants;

  const ParticipantsLoaded({
    required this.evenementId,
    required this.participants,
  });

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

/// État avec statistiques
class EvenementsStatsLoaded extends EvenementsState {
  final Map<String, dynamic> stats;

  const EvenementsStatsLoaded(this.stats);

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

/// État d'erreur
class EvenementsError extends EvenementsState {
  final String message;
  final String? code;
  final dynamic error;

  const EvenementsError({
    required this.message,
    this.code,
    this.error,
  });

  @override
  List<Object?> get props => [message, code, error];
}

/// État d'erreur réseau
class EvenementsNetworkError extends EvenementsError {
  const EvenementsNetworkError({
    required super.message,
    super.code,
    super.error,
  });
}

/// État d'erreur de validation
class EvenementsValidationError extends EvenementsError {
  final Map<String, String> validationErrors;

  const EvenementsValidationError({
    required super.message,
    required this.validationErrors,
    super.code,
  });

  @override
  List<Object?> get props => [message, code, validationErrors];
}

