using FluentValidation;

namespace SIGCM2.Application.Roles.Create;

public sealed class CreateRolCommandValidator : AbstractValidator<CreateRolCommand>
{
    private const int CodigoMinLength = 3;
    private const int CodigoMaxLength = 30;
    private const int NombreMaxLength = 60;
    private const int DescripcionMaxLength = 250;

    public CreateRolCommandValidator()
    {
        RuleFor(x => x.Codigo)
            .NotEmpty().WithMessage("El código es requerido.")
            .Length(CodigoMinLength, CodigoMaxLength)
                .WithMessage($"El código debe tener entre {CodigoMinLength} y {CodigoMaxLength} caracteres.")
            .Matches(@"^[a-z][a-z0-9_]*$")
                .WithMessage("El código debe empezar con una letra minúscula y contener solo minúsculas, dígitos o guion bajo.");

        RuleFor(x => x.Nombre)
            .NotEmpty().WithMessage("El nombre es requerido.")
            .MaximumLength(NombreMaxLength)
                .WithMessage($"El nombre no puede superar los {NombreMaxLength} caracteres.");

        RuleFor(x => x.Descripcion)
            .MaximumLength(DescripcionMaxLength)
                .WithMessage($"La descripción no puede superar los {DescripcionMaxLength} caracteres.")
            .When(x => x.Descripcion is not null);
    }
}
