namespace ChatService.Domain.AggregatesModel.ConversationAggregate;

using ChatService.Domain.SeedWork;

/// <summary>
/// EN: Participant in a conversation.
/// VI: Thành viên trong cuộc hội thoại.
/// </summary>
public class ConversationParticipant : Entity
{
    /// <summary>
    /// EN: The conversation this participant belongs to.
    /// VI: Cuộc hội thoại mà thành viên này thuộc về.
    /// </summary>
    public Guid ConversationId { get; private set; }

    /// <summary>
    /// EN: The chat user ID of this participant.
    /// VI: Chat user ID của thành viên này.
    /// </summary>
    public Guid UserId { get; private set; }

    /// <summary>
    /// EN: When the user joined this conversation.
    /// VI: Thời điểm user tham gia cuộc hội thoại.
    /// </summary>
    public DateTime JoinedAt { get; private set; }

    /// <summary>
    /// EN: Last time this user read messages in this conversation.
    /// VI: Lần cuối user đọc tin nhắn trong cuộc hội thoại này.
    /// </summary>
    public DateTime? LastReadAt { get; private set; }

    /// <summary>
    /// EN: ID of the last message read by this user.
    /// VI: ID của tin nhắn cuối cùng user đã đọc.
    /// </summary>
    public Guid? LastReadMessageId { get; private set; }

    /// <summary>
    /// EN: Whether this participant is an admin (for group chats).
    /// VI: Thành viên này có phải admin không (cho group chats).
    /// </summary>
    public bool IsAdmin { get; private set; }

    /// <summary>
    /// EN: Whether notifications are muted for this user.
    /// VI: Thông báo có bị tắt cho user này không.
    /// </summary>
    public bool IsMuted { get; private set; }

    /// <summary>
    /// EN: When the user left this conversation (null if still active).
    /// VI: Thời điểm user rời khỏi cuộc hội thoại (null nếu còn hoạt động).
    /// </summary>
    public DateTime? LeftAt { get; private set; }

    protected ConversationParticipant()
    {
        // EN: Required by EF Core
        // VI: Yêu cầu bởi EF Core
    }

    public ConversationParticipant(Guid conversationId, Guid userId, bool isAdmin = false)
    {
        Id = Guid.NewGuid();
        ConversationId = conversationId;
        UserId = userId;
        IsAdmin = isAdmin;
        IsMuted = false;
        JoinedAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Update last read information.
    /// VI: Cập nhật thông tin đã đọc cuối cùng.
    /// </summary>
    public void UpdateLastRead(Guid messageId)
    {
        LastReadMessageId = messageId;
        LastReadAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Toggle mute status.
    /// VI: Bật/tắt trạng thái mute.
    /// </summary>
    public void SetMuted(bool muted)
    {
        IsMuted = muted;
    }

    /// <summary>
    /// EN: Set admin status.
    /// VI: Đặt trạng thái admin.
    /// </summary>
    public void SetAdmin(bool isAdmin)
    {
        IsAdmin = isAdmin;
    }

    /// <summary>
    /// EN: Mark participant as left.
    /// VI: Đánh dấu thành viên đã rời đi.
    /// </summary>
    public void Leave()
    {
        LeftAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Check if participant is still active.
    /// VI: Kiểm tra thành viên còn hoạt động không.
    /// </summary>
    public bool IsActive => LeftAt == null;
}
