using FluentValidation;

namespace CMSMicroservice.Application.ProductsCQ.Commands.UpdateProductBulk;

public class UpdateProductBulkCommandValidator : AbstractValidator<UpdateProductBulkCommand>
{
    public UpdateProductBulkCommandValidator()
    {
        RuleFor(x => x.ProductIds)
            .NotEmpty().WithMessage("حداقل یک محصول باید انتخاب شود")
            .Must(x => x.Count <= 100).WithMessage("حداکثر 100 محصول را می‌توان همزمان به‌روزرسانی کرد");

        RuleFor(x => x.NewPrice)
            .GreaterThan(0).WithMessage("قیمت باید بزرگتر از صفر باشد")
            .LessThanOrEqualTo(1_000_000_000).WithMessage("قیمت نامعتبر است")
            .When(x => x.NewPrice.HasValue);

        RuleFor(x => x.PriceChangePercent)
            .GreaterThanOrEqualTo(-100).WithMessage("درصد تخفیف نمی‌تواند بیشتر از 100% باشد")
            .LessThanOrEqualTo(1000).WithMessage("درصد افزایش نامعتبر است")
            .When(x => x.PriceChangePercent.HasValue);

        RuleFor(x => x.Stock)
            .GreaterThanOrEqualTo(0).WithMessage("موجودی نمی‌تواند منفی باشد")
            .When(x => x.Stock.HasValue);

        RuleFor(x => x)
            .Must(x => x.NewPrice.HasValue || x.PriceChangePercent.HasValue || 
                       x.Stock.HasValue || x.StockIncrement.HasValue)
            .WithMessage("حداقل یک فیلد برای به‌روزرسانی باید مشخص شود");

        RuleFor(x => x)
            .Must(x => !(x.NewPrice.HasValue && x.PriceChangePercent.HasValue))
            .WithMessage("نمی‌توان همزمان قیمت جدید و درصد تغییر قیمت را مشخص کرد");

        RuleFor(x => x)
            .Must(x => !(x.Stock.HasValue && x.StockIncrement.HasValue))
            .WithMessage("نمی‌توان همزمان موجودی جدید و افزایش موجودی را مشخص کرد");
    }
}
