import 'package:equatable/equatable.dart';

/// Entité de domaine représentant un commentaire sur un post social.
///
/// Cette entité est pure et indépendante de la couche de données.
/// Elle représente un commentaire dans le domaine métier.
class Comment extends Equatable {
  const Comment({
    required this.id,
    required this.postId,
    required this.userId,
    required this.userFirstName,
    required this.userLastName,
    required this.userProfileImageUrl,
    required this.content,
    required this.timestamp,
  });

  /// ID unique du commentaire
  final String id;

  /// ID du post auquel appartient ce commentaire
  final String postId;

  /// ID de l'utilisateur qui a créé le commentaire
  final String userId;

  /// Prénom de l'utilisateur
  final String userFirstName;

  /// Nom de l'utilisateur
  final String userLastName;

  /// URL de l'image de profil de l'utilisateur
  final String userProfileImageUrl;

  /// Contenu du commentaire
  final String content;

  /// Date et heure de création du commentaire
  final DateTime timestamp;

  /// Retourne le nom complet de l'auteur du commentaire
  String get authorFullName => '$userFirstName $userLastName';

  @override
  List<Object?> get props => [
        id,
        postId,
        userId,
        userFirstName,
        userLastName,
        userProfileImageUrl,
        content,
        timestamp,
      ];

  /// Crée une copie de ce commentaire avec des valeurs modifiées.
  Comment copyWith({
    String? id,
    String? postId,
    String? userId,
    String? userFirstName,
    String? userLastName,
    String? userProfileImageUrl,
    String? content,
    DateTime? timestamp,
  }) {
    return Comment(
      id: id ?? this.id,
      postId: postId ?? this.postId,
      userId: userId ?? this.userId,
      userFirstName: userFirstName ?? this.userFirstName,
      userLastName: userLastName ?? this.userLastName,
      userProfileImageUrl: userProfileImageUrl ?? this.userProfileImageUrl,
      content: content ?? this.content,
      timestamp: timestamp ?? this.timestamp,
    );
  }
}
