using MktXService.Domain.SeedWork;

namespace MktXService.Domain.AggregatesModel.TwitterAccountAggregate;

/// <summary>
/// EN: Twitter account status enumeration following type-safe enum pattern.
/// VI: Enumeration trạng thái tài khoản Twitter theo pattern enum an toàn kiểu.
/// </summary>
public class TwitterAccountStatus : Enumeration
{
    /// <summary>
    /// EN: Pending status - awaiting verification
    /// VI: Trạng thái chờ - đang chờ xác minh
    /// </summary>
    public static TwitterAccountStatus 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à hoạt động
    /// </summary>
    public static TwitterAccountStatus Active = new(2, nameof(Active));

    /// <summary>
    /// EN: Inactive status - temporarily disabled
    /// VI: Trạng thái không hoạt động - tạm thời vô hiệu hóa
    /// </summary>
    public static TwitterAccountStatus Inactive = new(3, nameof(Inactive));

    /// <summary>
    /// EN: Error status - connection issues
    /// VI: Trạng thái lỗi - sự cố kết nối
    /// </summary>
    public static TwitterAccountStatus Error = new(4, nameof(Error));

    /// <summary>
    /// EN: Disconnected status - user revoked access
    /// VI: Trạng thái đã ngắt kết nối - người dùng thu hồi quyền truy cập
    /// </summary>
    public static TwitterAccountStatus Disconnected = new(5, nameof(Disconnected));

    public TwitterAccountStatus(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<TwitterAccountStatus> List() => GetAll<TwitterAccountStatus>();

    /// <summary>
    /// EN: Parse status from name.
    /// VI: Parse trạng thái từ tên.
    /// </summary>
    public static TwitterAccountStatus 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 TwitterAccountStatus: {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 TwitterAccountStatus From(int id)
    {
        var status = List().SingleOrDefault(s => s.Id == id);

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

        return status;
    }
}
