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

namespace Back.Validations
{
    public class AddOrUpdateInvoiceValidation : AbstractValidator<Tuple<int, NUInvoiceDTO, eActionValidation>>
    {
        public AddOrUpdateInvoiceValidation(IAsyncRepository<Pattern> patternRepo, servCustomer servCustomer
            , servInvoice servInvoice, CheckPermission checkPermission)
        {
            When(m => m.Item3 == eActionValidation.update, () =>
            {
                RuleFor(r => r)
              .Custom((model, context) =>
              {
                  if (model.Item2.ID == null || model.Item2.ID <= 0)
                      context.AddFailure("شناسه صورتحساب در حالت ویرایش نمی تواند خالی باشد");

                  else if (!servInvoice.ExistInvoiceByInvoiceID(model.Item1,model.Item2.ID.Value ).Result)
                      context.AddFailure("ضورتحساب یافت نشد");

                  else if (servInvoice.checkFatherInvoiceByInvoiceID(model.Item1, model.Item2.ID.Value).Result)
                      context.AddFailure("این صورتحساب، مرجع چند صورتحساب دیگر می باشد " +'\n'+
                          "ابتدا آن هارا حذف کنید");
              });

            });
            When(m => m.Item3 == eActionValidation.add, () =>
            {
                RuleFor(r => r.Item1)
              .Custom((CompanyID, context) =>
              {
                  if (!checkPermission.AllowAddInvoiceInCompany(CompanyID).Result)
                      context.AddFailure("اضافه کردن صورتحساب محدود شده است");

              });

            });

            RuleFor(r => r.Item2.Title)
                .NotNull().WithMessage("عنوان نمی تواند خالی باشد")
                .NotEmpty().WithMessage("عنوان نمی تواند خالی باشد")
                .MinimumLength(3).WithMessage("عنوان حداقل باید 3 کاراکتر باشد");

            RuleFor(r => r.Item2.PatternID)
                .Custom((PatternID, context) =>
                {
                    if (PatternID!=null && PatternID > 0 && !patternRepo.Get(w => w.Status && w.ID == PatternID).AnyAsync().Result)
                        context.AddFailure("الگوی صورتحساب معتبر نیست");
                });

            RuleFor(r => r)
               .Custom((model, context) =>
               {
                   if (model.Item2.CustomerID == null || model.Item2.CustomerID <=0)
                       context.AddFailure("برای صدور صورتحساب باید مشتری تعریف شود");
                   
                   else if (!servCustomer.ExistCustomerByCustomerID(model.Item2.CustomerID, model.Item1).Result)
                       context.AddFailure("مشتری یافت نشد");
               });

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

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

            RuleFor(r => r.Item2.InvoicIssueDate)
                   .Custom((InvoicIssueDate, context) =>
                   {
                       if (string.IsNullOrEmpty(InvoicIssueDate))
                           context.AddFailure("تاریخ صدور صورتحساب نمی تواند خالی باشد");

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