using Back.Data.Contracts;
using FluentValidation;
using Shared.DTOs.Warehouse;
using Back.Services;
using Back.Data.Models;
using Back.Common;

namespace Back.Validations.Warehouse.Receipt
{
    public class ADDValidation : AbstractValidator<Tuple<ReceiptDto,int>>
    {
        public ADDValidation(ServCOD servCOD, CheckPermission checkPermission)
        {
            // کالا مدنظر برای شرکت است
            CascadeMode = CascadeMode.Stop;

            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(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(r => r.Item2)
             .Custom((CompanyID, context) =>
             {
                 if (!checkPermission.AllowAddReceiptInCompany(CompanyID).Result)
                     context.AddFailure("اضافه کردن رسید محدود شده است");

             });
        }
    }
}
