using MktZaloService.Domain.Enums;
using MktZaloService.Domain.SeedWork;

namespace MktZaloService.Domain.AggregatesModel.ConversationAggregate;

/// <summary>
/// EN: Represents a message within a conversation.
/// VI: Đại diện cho một tin nhắn trong cuộc hội thoại.
/// </summary>
public class Message : Entity
{
    /// <summary>
    /// EN: Type of the message (text, image, etc.).
    /// VI: Loại tin nhắn (văn bản, hình ảnh, v.v.).
    /// </summary>
    public MessageType Type { get; private set; }

    /// <summary>
    /// EN: Content of the message.
    /// VI: Nội dung tin nhắn.
    /// </summary>
    public string Content { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Direction of the message (incoming/outgoing).
    /// VI: Hướng tin nhắn (đến/đi).
    /// </summary>
    public MessageDirection Direction { get; private set; }

    /// <summary>
    /// EN: Whether this message was sent by the chatbot.
    /// VI: Tin nhắn này có phải do chatbot gửi không.
    /// </summary>
    public bool IsFromBot { get; private set; }

    /// <summary>
    /// EN: Timestamp when the message was sent.
    /// VI: Thời điểm tin nhắn được gửi.
    /// </summary>
    public DateTime SentAt { get; private set; }

    /// <summary>
    /// EN: Zalo's message ID for tracking.
    /// VI: ID tin nhắn của Zalo để theo dõi.
    /// </summary>
    public string? ZaloMessageId { get; private set; }

    /// <summary>
    /// EN: ID of the parent conversation.
    /// VI: ID của cuộc hội thoại cha.
    /// </summary>
    public Guid ConversationId { get; private set; }

    /// <summary>
    /// EN: Navigation property to parent Conversation.
    /// VI: Navigation property đến Conversation cha.
    /// </summary>
    public Conversation Conversation { get; private set; } = null!;

    /// <summary>
    /// EN: Required by EF Core.
    /// VI: Yêu cầu bởi EF Core.
    /// </summary>
    protected Message() { }

    /// <summary>
    /// EN: Create a new message.
    /// VI: Tạo tin nhắn mới.
    /// </summary>
    public Message(
        MessageType type,
        string content,
        MessageDirection direction,
        bool isFromBot,
        string? zaloMessageId = null)
    {
        Id = Guid.NewGuid();
        Type = type;
        Content = content ?? throw new ArgumentNullException(nameof(content));
        Direction = direction;
        IsFromBot = isFromBot;
        SentAt = DateTime.UtcNow;
        ZaloMessageId = zaloMessageId;
    }

    /// <summary>
    /// EN: Update Zalo message ID after sending.
    /// VI: Cập nhật ID tin nhắn Zalo sau khi gửi.
    /// </summary>
    public void SetZaloMessageId(string zaloMessageId)
    {
        ZaloMessageId = zaloMessageId ?? throw new ArgumentNullException(nameof(zaloMessageId));
    }
}
