using FluentValidation;
using SIGCM.Application.DTOs;

namespace SIGCM.Application.Validators;

public class CreateListingDtoValidator : AbstractValidator<CreateListingDto>
{
    public CreateListingDtoValidator()
    {
        RuleFor(x => x.CategoryId)
            .GreaterThan(0)
            .WithMessage("Debe seleccionar un rubro válido.");

        RuleFor(x => x.OperationId)
            .GreaterThan(0)
            .WithMessage("Debe seleccionar una operación válida.");

        RuleFor(x => x.PrintText)
            .NotEmpty()
            .WithMessage("El texto del aviso no puede estar vacío.")
            .MinimumLength(10)
            .WithMessage("El texto del aviso es demasiado corto (mínimo 10 caracteres).");

        RuleFor(x => x.PrintDaysCount)
            .InclusiveBetween(1, 365)
            .WithMessage("La duración debe ser entre 1 y 365 días.");

        RuleFor(x => x.AdFee)
            .GreaterThanOrEqualTo(0)
            .WithMessage("El costo del aviso no puede ser negativo.");

        RuleFor(x => x.ClientDni)
            .NotEmpty()
            .When(x => !string.IsNullOrEmpty(x.ClientName))
            .WithMessage("Si especifica un nombre de cliente, el DNI/CUIT es obligatorio.");

        RuleForEach(x => x.Payments).SetValidator(new PaymentDtoValidator());
    }
}

public class PaymentDtoValidator : AbstractValidator<PaymentDto>
{
    public PaymentDtoValidator()
    {
        RuleFor(x => x.Amount)
            .GreaterThan(0)
            .WithMessage("El monto del pago debe ser mayor a 0.");

        RuleFor(x => x.PaymentMethod)
            .NotEmpty()
            .WithMessage("Debe especificar un medio de pago.");
    }
}
