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

namespace SIGCM2.Application.PuntosDeVenta.List;

public sealed class ListPuntosDeVentaQueryHandler : ICommandHandler<ListPuntosDeVentaQuery, PagedResult<PuntoDeVentaListItemDto>>
{
    private readonly IPuntoDeVentaRepository _repo;

    public ListPuntosDeVentaQueryHandler(IPuntoDeVentaRepository repo)
    {
        _repo = repo;
    }

    public async Task<PagedResult<PuntoDeVentaListItemDto>> Handle(ListPuntosDeVentaQuery query)
    {
        var page = Math.Max(1, query.Page);
        var pageSize = Math.Clamp(query.PageSize, 1, 100);

        var repoQuery = new PuntosDeVentaQuery(page, pageSize, query.MedioId, query.Activo);
        var paged = await _repo.GetPagedAsync(repoQuery);

        var items = paged.Items
            .Select(p => new PuntoDeVentaListItemDto(p.Id, p.MedioId, p.NumeroAFIP, p.Nombre, p.Activo))
            .ToList();

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