/// Événements du BLoC Messagerie v4
library messaging_event;

import 'package:equatable/equatable.dart';

abstract class MessagingEvent extends Equatable {
  const MessagingEvent();

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

// ── Conversations ─────────────────────────────────────────────────────────────

/// Charger la liste des conversations
class LoadMesConversations extends MessagingEvent {
  const LoadMesConversations();
}

/// Ouvrir une conversation (charge le détail)
class OpenConversation extends MessagingEvent {
  final String conversationId;

  const OpenConversation(this.conversationId);

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

/// Démarrer une conversation directe avec un membre
class DemarrerConversationDirecte extends MessagingEvent {
  final String destinataireId;
  final String organisationId;
  final String? premierMessage;

  const DemarrerConversationDirecte({
    required this.destinataireId,
    required this.organisationId,
    this.premierMessage,
  });

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

/// Démarrer un canal de communication avec un rôle
class DemarrerConversationRole extends MessagingEvent {
  final String roleCible;
  final String organisationId;
  final String? premierMessage;

  const DemarrerConversationRole({
    required this.roleCible,
    required this.organisationId,
    this.premierMessage,
  });

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

/// Archiver une conversation
class ArchiverConversation extends MessagingEvent {
  final String conversationId;

  const ArchiverConversation(this.conversationId);

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

// ── Messages ──────────────────────────────────────────────────────────────────

/// Envoyer un message texte
class EnvoyerMessageTexte extends MessagingEvent {
  final String conversationId;
  final String contenu;
  final String? messageParentId;

  const EnvoyerMessageTexte({
    required this.conversationId,
    required this.contenu,
    this.messageParentId,
  });

  @override
  List<Object?> get props => [conversationId, contenu, messageParentId];
}

/// Charger l'historique des messages
class LoadMessages extends MessagingEvent {
  final String conversationId;
  final int page;

  const LoadMessages({required this.conversationId, this.page = 0});

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

/// Marquer une conversation comme lue
class MarquerLu extends MessagingEvent {
  final String conversationId;

  const MarquerLu(this.conversationId);

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

/// Supprimer un message
class SupprimerMessage extends MessagingEvent {
  final String conversationId;
  final String messageId;

  const SupprimerMessage({
    required this.conversationId,
    required this.messageId,
  });

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

// ── Temps réel WebSocket ───────────────────────────────────────────────────────

/// Nouveau message reçu via WebSocket
class NouveauMessageWebSocket extends MessagingEvent {
  final String conversationId;

  const NouveauMessageWebSocket(this.conversationId);

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