namespace CMSMicroservice.Application.ProductsCQ.Commands.UpdateProducts;

public class UpdateProductsCommandValidator : AbstractValidator<UpdateProductsCommand>
{
    public UpdateProductsCommandValidator()
    {
        RuleFor(model => model.Id)
            .NotNull().WithMessage("شناسه محصول الزامی است");

        RuleFor(model => model.Title)
            .NotEmpty().WithMessage("عنوان محصول الزامی است");
        
        RuleFor(model => model.Price)
            .GreaterThanOrEqualTo(0).WithMessage("قیمت نمی‌تواند منفی باشد");
        
        RuleFor(model => model.Discount)
            .InclusiveBetween(0, 100).WithMessage("تخفیف باید بین 0 تا 100 باشد");
    }

    public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) =>
    {
        var result = await ValidateAsync(
            ValidationContext<UpdateProductsCommand>.CreateWithOptions(
                (UpdateProductsCommand)model, x => x.IncludeProperties(propertyName)));
        if (result.IsValid)
            return Array.Empty<string>();
        return result.Errors.Select(e => e.ErrorMessage);
    };
}
