using Back.Common;
using Back.Services;
using Back.Services.Warehouse;
using FluentValidation;
using Shared.DTOs.Warehouse;

namespace Back.Validations.Warehouse.Remittance
{
    public class ADDValidation : AbstractValidator<Tuple<RemittanceDto, int>>
    {
        public ADDValidation(ServCOD servCOD, WarehouseService warehouseService)
        {
            CascadeMode = CascadeMode.Stop;

            RuleFor(r => r.Item1.Date)
                    .Custom((InvoiceDate, context) =>
                    {
                        if (string.IsNullOrEmpty(InvoiceDate))
                            context.AddFailure("تاریخ نمی تواند خالی باشد");

                        else if (InvoiceDate.Length != 8)
                            context.AddFailure("تاریخ صحیح نمی باشد");

                        else if (InvoiceDate.Trim().ToMiladi() > DateTime.Now)
                            context.AddFailure("تاریخ از امروز جلوتر باشد");
                    });

            RuleFor(model => model)
         .Custom((model, context) =>
         {
             if (!servCOD.ExistCodByCompanyID(model.Item1.CODID, model.Item2).Result)
                 context.AddFailure("کد کالا یافت نشد");
         });

            RuleFor(model => model.Item1.Count)
           .Custom((model, context) => {
               if (model <= 0)
                   context.AddFailure("تعداد نمیتواند صفر یا کمتر از صفر باشد");
           });

            RuleFor(model => model.Item1.info)
        .Custom((model, context) => {
            if (string.IsNullOrEmpty(model))
                context.AddFailure("توضیحی برای رسید در نظر بگیرید");
        });

            RuleFor(model => model)
     .Custom((model, context) =>
     {
         var inv = warehouseService.Inventory(model.Item2, model.Item1.CODID).Result;
         if (inv < model.Item1.Count)
             context.AddFailure("موجودی کمتر از مقدار حواله می باشد");
     });
        }
    }
}
