using SIGCM2.Application.Abstractions;
using SIGCM2.Application.Abstractions.Persistence;
using SIGCM2.Application.Common;

namespace SIGCM2.Application.Usuarios.List;

public sealed class ListUsuariosQueryHandler : ICommandHandler<ListUsuariosQuery, PagedResult<UsuarioListItemDto>>
{
    private readonly IUsuarioRepository _repository;

    public ListUsuariosQueryHandler(IUsuarioRepository repository)
    {
        _repository = repository;
    }

    public async Task<PagedResult<UsuarioListItemDto>> Handle(ListUsuariosQuery query)
    {
        // Clamp paging params
        var page = Math.Max(1, query.Page);
        var pageSize = Math.Clamp(query.PageSize, 1, 100);

        var repoQuery = new UsuariosQuery(page, pageSize, query.Rol, query.Activo, query.Search);
        var paged = await _repository.GetPagedAsync(repoQuery);

        var items = paged.Items
            .Select(u => new UsuarioListItemDto(u.Id, u.Username, u.Nombre, u.Apellido, u.Email, u.Rol, u.Activo, u.UltimoLogin))
            .ToList();

        return new PagedResult<UsuarioListItemDto>(items, paged.Page, paged.PageSize, paged.Total);
    }
}
