import 'package:equatable/equatable.dart';

import 'chat_message.dart';

/// Entité de domaine représentant une conversation entre deux utilisateurs.
///
/// Une conversation regroupe tous les messages échangés entre deux amis.
class Conversation extends Equatable {
  const Conversation({
    required this.id,
    required this.participantId,
    required this.participantFirstName,
    required this.participantLastName,
    required this.participantProfileImageUrl,
    this.lastMessage,
    this.lastMessageTimestamp,
    required this.unreadCount,
    this.isTyping = false,
  });

  final String id;
  final String participantId; // L'autre utilisateur
  final String participantFirstName;
  final String participantLastName;
  final String? participantProfileImageUrl;
  final String? lastMessage; // Contenu du dernier message
  final DateTime? lastMessageTimestamp;
  final int unreadCount; // Nombre de messages non lus
  final bool isTyping; // L'autre utilisateur est en train de taper

  /// Nom complet du participant.
  String get participantFullName => '$participantFirstName $participantLastName';

  /// Indique si la conversation a des messages non lus.
  bool get hasUnreadMessages => unreadCount > 0;

  /// Indique si la conversation a un dernier message.
  bool get hasLastMessage => lastMessage != null && lastMessageTimestamp != null;

  @override
  List<Object?> get props => [
        id,
        participantId,
        participantFirstName,
        participantLastName,
        participantProfileImageUrl,
        lastMessage,
        lastMessageTimestamp,
        unreadCount,
        isTyping,
      ];

  /// Crée une copie de cette conversation avec des valeurs modifiées.
  Conversation copyWith({
    String? id,
    String? participantId,
    String? participantFirstName,
    String? participantLastName,
    String? participantProfileImageUrl,
    String? lastMessage,
    DateTime? lastMessageTimestamp,
    int? unreadCount,
    bool? isTyping,
  }) {
    return Conversation(
      id: id ?? this.id,
      participantId: participantId ?? this.participantId,
      participantFirstName: participantFirstName ?? this.participantFirstName,
      participantLastName: participantLastName ?? this.participantLastName,
      participantProfileImageUrl: participantProfileImageUrl ?? this.participantProfileImageUrl,
      lastMessage: lastMessage ?? this.lastMessage,
      lastMessageTimestamp: lastMessageTimestamp ?? this.lastMessageTimestamp,
      unreadCount: unreadCount ?? this.unreadCount,
      isTyping: isTyping ?? this.isTyping,
    );
  }
}
