// Version: 1.1.0 | Created: 2026-04-01 | Updated: 2026-04-10
// Immutable message model for the chat timeline.

import 'package:freezed_annotation/freezed_annotation.dart';

part 'message_model.freezed.dart';

/// Content type of a message event.
enum MessageType {
  text,
  image,
  file,
  audio,
  video,
  sticker,
  redacted,
  encrypted,
  unsupported,
}

@freezed
abstract class MessageModel with _$MessageModel {
  const factory MessageModel({
    required String eventId,
    required String roomId,
    required String senderId,
    required String senderDisplayName,
    String? senderAvatarUrl,
    required DateTime timestamp,
    required MessageType type,
    // Text content (for text messages).
    String? body,
    // URL for media messages.
    String? mediaUrl,
    // MXC URI for the media (used to download from homeserver).
    String? mxcUrl,
    // If this is a reply, the event ID of the original message.
    String? inReplyToEventId,
    // Reactions: emoji → list of sender IDs.
    @Default({}) Map<String, List<String>> reactions,
    // Read receipts: sender IDs of users who have read up to this event.
    @Default([]) List<String> readByUserIds,
    @Default(false) bool isEdited,
    @Default(false) bool isMine,
  }) = _MessageModel;
}
