using WhatsAppService.Domain.SeedWork;

namespace WhatsAppService.Domain.AggregatesModel.WhatsAppAccountAggregate;

/// <summary>
/// EN: WhatsApp account status enumeration following type-safe enum pattern.
/// VI: Enumeration trạng thái WhatsApp account theo pattern enum an toàn kiểu.
/// </summary>
public class WhatsAppAccountStatus : Enumeration
{
    /// <summary>
    /// EN: Pending status - awaiting verification
    /// VI: Trạng thái chờ - đang chờ xác minh
    /// </summary>
    public static WhatsAppAccountStatus Pending = new(1, nameof(Pending));

    /// <summary>
    /// EN: Active status - connected and operational
    /// VI: Trạng thái hoạt động - đã kết nối và vận hành
    /// </summary>
    public static WhatsAppAccountStatus Active = new(2, nameof(Active));

    /// <summary>
    /// EN: Suspended status - temporarily disabled
    /// VI: Trạng thái tạm ngưng - bị vô hiệu hóa tạm thời
    /// </summary>
    public static WhatsAppAccountStatus Suspended = new(3, nameof(Suspended));

    /// <summary>
    /// EN: Disconnected status - permanently removed
    /// VI: Trạng thái ngắt kết nối - bị xóa vĩnh viễn
    /// </summary>
    public static WhatsAppAccountStatus Disconnected = new(4, nameof(Disconnected));

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

    /// <summary>
    /// EN: Get all available statuses.
    /// VI: Lấy tất cả các trạng thái có sẵn.
    /// </summary>
    public static IEnumerable<WhatsAppAccountStatus> List() => GetAll<WhatsAppAccountStatus>();

    /// <summary>
    /// EN: Parse status from name.
    /// VI: Parse trạng thái từ tên.
    /// </summary>
    public static WhatsAppAccountStatus FromName(string name)
    {
        var status = List().SingleOrDefault(s => 
            string.Equals(s.Name, name, StringComparison.CurrentCultureIgnoreCase));

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

        return status;
    }

    /// <summary>
    /// EN: Parse status from ID.
    /// VI: Parse trạng thái từ ID.
    /// </summary>
    public static WhatsAppAccountStatus From(int id)
    {
        var status = List().SingleOrDefault(s => s.Id == id);

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

        return status;
    }
}
