using FluentValidation;

namespace SIGCM2.Application.TiposDeIva.Create;

public sealed class CreateTipoDeIvaCommandValidator : AbstractValidator<CreateTipoDeIvaCommand>
{
    private const int DescripcionMaxLength = 255;

    public CreateTipoDeIvaCommandValidator()
    {
        RuleFor(x => x.Codigo)
            .NotEmpty().WithMessage("El código es requerido.")
            .Matches(@"^(EXENTO|NO_GRAVADO|IVA_\d+)$")
            .WithMessage("El código debe cumplir el formato EXENTO, NO_GRAVADO o IVA_{número}.");

        RuleFor(x => x.Descripcion)
            .NotEmpty().WithMessage("La descripción es requerida.")
            .MaximumLength(DescripcionMaxLength)
            .WithMessage($"La descripción no puede superar los {DescripcionMaxLength} caracteres.");

        RuleFor(x => x.Porcentaje)
            .InclusiveBetween(0m, 100m)
            .WithMessage("El porcentaje debe estar entre 0 y 100.");

        RuleFor(x => x.VigenciaDesde)
            .NotEqual(default(DateOnly))
            .WithMessage("La fecha de vigencia desde es requerida.");

        RuleFor(x => x.VigenciaHasta)
            .GreaterThanOrEqualTo(x => x.VigenciaDesde)
            .WithMessage("VigenciaHasta no puede ser anterior a VigenciaDesde.")
            .When(x => x.VigenciaHasta.HasValue);
    }
}
