using IamService.Domain.SeedWork;

namespace IamService.Domain.AggregatesModel.GroupAggregate;

/// <summary>
/// EN: Group role enumeration.
/// VI: Enumeration vai trò trong nhóm.
/// </summary>
public class GroupRole : Enumeration
{
    /// <summary>
    /// EN: Regular member with basic permissions.
    /// VI: Thành viên thường với quyền cơ bản.
    /// </summary>
    public static readonly GroupRole Member = new(1, nameof(Member));

    /// <summary>
    /// EN: Admin with management permissions.
    /// VI: Admin với quyền quản lý.
    /// </summary>
    public static readonly GroupRole Admin = new(2, nameof(Admin));

    /// <summary>
    /// EN: Owner with full control.
    /// VI: Owner với toàn quyền kiểm soát.
    /// </summary>
    public static readonly GroupRole Owner = new(3, nameof(Owner));

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

    /// <summary>
    /// EN: Get all group roles.
    /// VI: Lấy tất cả vai trò trong nhóm.
    /// </summary>
    public static IEnumerable<GroupRole> GetAll() =>
    [
        Member,
        Admin,
        Owner
    ];

    /// <summary>
    /// EN: Check if this role has higher or equal permissions than another.
    /// VI: Kiểm tra vai trò này có quyền cao hơn hoặc bằng vai trò khác không.
    /// </summary>
    public bool HasPermissionOver(GroupRole other)
    {
        return Id >= other.Id;
    }

    /// <summary>
    /// EN: Get role by ID.
    /// VI: Lấy vai trò theo ID.
    /// </summary>
    public static GroupRole? FromId(int id)
    {
        return id switch
        {
            1 => Member,
            2 => Admin,
            3 => Owner,
            _ => null
        };
    }
}
