using SIGCM2.Application.Abstractions;
using SIGCM2.Application.Abstractions.Persistence;
using SIGCM2.Application.Permisos.Dtos;
using SIGCM2.Domain.Exceptions;

namespace SIGCM2.Application.Permisos.GetByRol;

public sealed class GetRolPermisosQueryHandler : ICommandHandler<GetRolPermisosQuery, IReadOnlyList<PermisoDto>>
{
    private readonly IRolRepository _rolRepository;
    private readonly IRolPermisoRepository _rolPermisoRepository;

    public GetRolPermisosQueryHandler(IRolRepository rolRepository, IRolPermisoRepository rolPermisoRepository)
    {
        _rolRepository = rolRepository;
        _rolPermisoRepository = rolPermisoRepository;
    }

    public async Task<IReadOnlyList<PermisoDto>> Handle(GetRolPermisosQuery query)
    {
        var rol = await _rolRepository.GetByCodigoAsync(query.RolCodigo);
        if (rol is null)
            throw new RolNotFoundException(query.RolCodigo);

        var permisos = await _rolPermisoRepository.GetByRolCodigoAsync(query.RolCodigo);
        return permisos
            .Select(p => new PermisoDto(p.Id, p.Codigo, p.Nombre, p.Descripcion, p.Modulo))
            .ToList();
    }
}
