namespace ChatService.Domain.AggregatesModel.ConversationAggregate;

using ChatService.Domain.SeedWork;

/// <summary>
/// EN: Message status enumeration.
/// VI: Enumeration trạng thái tin nhắn.
/// </summary>
public class MessageStatus : Enumeration
{
    /// <summary>
    /// EN: Message has been sent by sender.
    /// VI: Tin nhắn đã được gửi bởi người gửi.
    /// </summary>
    public static readonly MessageStatus Sent = new(1, nameof(Sent).ToLowerInvariant());

    /// <summary>
    /// EN: Message has been delivered to recipient's device.
    /// VI: Tin nhắn đã được gửi đến thiết bị người nhận.
    /// </summary>
    public static readonly MessageStatus Delivered = new(2, nameof(Delivered).ToLowerInvariant());

    /// <summary>
    /// EN: Message has been read by recipient.
    /// VI: Tin nhắn đã được đọc bởi người nhận.
    /// </summary>
    public static readonly MessageStatus Read = new(3, nameof(Read).ToLowerInvariant());

    /// <summary>
    /// EN: Message sending failed.
    /// VI: Gửi tin nhắn thất bại.
    /// </summary>
    public static readonly MessageStatus Failed = new(4, nameof(Failed).ToLowerInvariant());

    public MessageStatus(int id, string name) : base(id, name)
    {
    }

    public static IEnumerable<MessageStatus> List() =>
        new[] { Sent, Delivered, Read, Failed };

    public static MessageStatus FromName(string name)
    {
        var state = List().SingleOrDefault(s => 
            string.Equals(s.Name, name, StringComparison.CurrentCultureIgnoreCase));

        if (state == null)
        {
            throw new ArgumentException($"Possible values for MessageStatus: {string.Join(",", List().Select(s => s.Name))}");
        }

        return state;
    }

    public static MessageStatus From(int id)
    {
        var state = List().SingleOrDefault(s => s.Id == id);

        if (state == null)
        {
            throw new ArgumentException($"Possible values for MessageStatus: {string.Join(",", List().Select(s => s.Name))}");
        }

        return state;
    }
}
