using FluentValidation;
using SIGCM2.Application.Abstractions.Persistence;

namespace SIGCM2.Application.Usuarios.Update;

public sealed class UpdateUsuarioCommandValidator : AbstractValidator<UpdateUsuarioCommand>
{
    public UpdateUsuarioCommandValidator(IRolRepository rolRepository)
    {
        RuleFor(x => x.Email)
            .EmailAddress()
            .When(x => x.Email is not null)
            .WithMessage("El formato del email es inválido.");

        RuleFor(x => x.Nombre)
            .NotEmpty()
            .WithMessage("El nombre es requerido.");

        RuleFor(x => x.Apellido)
            .NotEmpty()
            .WithMessage("El apellido es requerido.");

        RuleFor(x => x.Rol)
            .NotEmpty()
            .WithMessage("El rol es requerido.")
            .MustAsync(async (rol, ct) => await rolRepository.ExistsActiveByCodigoAsync(rol, ct))
            .WithMessage(x => $"El rol '{x.Rol}' no existe o está inactivo.");
    }
}
