/// Repository interface pour la messagerie v4
///
/// Contrat de données aligné sur l'API backend v4 (/api/messagerie/*)
library messaging_repository;

import '../entities/conversation.dart';
import '../entities/message.dart';
import '../entities/contact_policy.dart';

/// Interface du repository de messagerie
abstract class MessagingRepository {

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

  /// Récupère les conversations résumées de l'utilisateur connecté
  Future<List<ConversationSummary>> getMesConversations();

  /// Récupère la conversation complète (avec participants et messages)
  Future<Conversation> getConversation(String conversationId);

  /// Démarre une conversation directe avec un membre
  Future<Conversation> demarrerConversationDirecte({
    required String destinataireId,
    required String organisationId,
    String? premierMessage,
  });

  /// Démarre un canal de communication avec un rôle officiel
  Future<Conversation> demarrerConversationRole({
    required String roleCible,
    required String organisationId,
    String? premierMessage,
  });

  /// Archive une conversation
  Future<void> archiverConversation(String conversationId);

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

  /// Envoie un message dans une conversation
  Future<Message> envoyerMessage(
    String conversationId, {
    required String typeMessage,
    String? contenu,
    String? urlFichier,
    int? dureeAudio,
    String? messageParentId,
  });

  /// Récupère l'historique des messages (paginé)
  Future<List<Message>> getMessages(String conversationId, {int page = 0});

  /// Marque tous les messages d'une conversation comme lus
  Future<void> marquerLu(String conversationId);

  /// Supprime un message (soft-delete)
  Future<void> supprimerMessage(String conversationId, String messageId);

  // ── Blocages ──────────────────────────────────────────────────────────────

  /// Bloque un membre
  Future<void> bloquerMembre({
    required String membreABloquerId,
    String? organisationId,
    String? raison,
  });

  /// Débloque un membre
  Future<void> debloquerMembre(String membreId, {String? organisationId});

  /// Récupère la liste des membres bloqués
  Future<List<Map<String, dynamic>>> getMesBlocages();

  // ── Politique de communication ────────────────────────────────────────────

  /// Récupère la politique de communication d'une organisation
  Future<ContactPolicy> getPolitique(String organisationId);

  /// Met à jour la politique de communication (ADMIN seulement)
  Future<ContactPolicy> mettreAJourPolitique(
    String organisationId, {
    required String typePolitique,
    required bool autoriserMembreVersMembre,
    required bool autoriserMembreVersRole,
    required bool autoriserNotesVocales,
  });
}
