// EN: Query to get available staff roles.
// VI: Query để lấy danh sách vai trò nhân viên.

using MediatR;
using MerchantService.Domain.AggregatesModel.MerchantStaffAggregate;
using MerchantService.Domain.SeedWork;

namespace MerchantService.API.Application.Queries.Staff;

/// <summary>
/// EN: Query to get available staff roles.
/// VI: Query để lấy danh sách vai trò nhân viên có sẵn.
/// </summary>
public record GetStaffRolesQuery : IRequest<IReadOnlyList<StaffRoleDto>>;

/// <summary>
/// EN: Staff role DTO.
/// VI: DTO vai trò nhân viên.
/// </summary>
public record StaffRoleDto
{
    public int Id { get; init; }
    public string Name { get; init; } = null!;
}

/// <summary>
/// EN: Handler for getting available staff roles from domain enumeration.
/// VI: Handler để lấy danh sách vai trò nhân viên từ domain enumeration.
/// </summary>
public class GetStaffRolesQueryHandler : IRequestHandler<GetStaffRolesQuery, IReadOnlyList<StaffRoleDto>>
{
    public Task<IReadOnlyList<StaffRoleDto>> Handle(GetStaffRolesQuery request, CancellationToken cancellationToken)
    {
        // EN: Get all staff roles from domain enumeration.
        // VI: Lấy tất cả vai trò nhân viên từ domain enumeration.
        var roles = Enumeration.GetAll<StaffRole>()
            .Select(r => new StaffRoleDto
            {
                Id = r.Id,
                Name = r.Name
            })
            .OrderBy(r => r.Id)
            .ToList();

        return Task.FromResult<IReadOnlyList<StaffRoleDto>>(roles);
    }
}
