import { openNotification } from 'client/Elements/Notification';
import { ICalculationStore } from 'core/types/Calculation/Store';
import { Process } from 'core/types/Calculation/Store/process';
import { reaction } from 'mobx';
import { ElementStatus } from 'types/elements';

export default function ($calculation: ICalculationStore) {
  /**
 * 
 * @description
 * Создаем реакцию на выбор Продукта selectProduct:

Если в поле Продукт selectProduct значение не выбрано, то 
    поле Валюта поставщика selectSupplierCurrency закрыть для редактирования и сделать равным RUB
    поле Скидка от поставщика tbxSupplierDiscountRub закрыть для редактирования и сделать равным 0
    поле Скидка от поставщика, % tbxSupplierDiscountPerc закрыть для редактирования и сделать равным 0
    поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice закрыть для редактирования
    поле Стоимость предмета лизинга без НДС xxx закрыть для редактирования
    поле НДС в стоимости предмета лизинга xxx закрыть для редактирования

Если в поле Продукт selectProduct  выбрана запись, у которой БУбезНДС evo_sale_without_nds = True, то:
    поле ПЛ БУ cbxLeaseObjectUsed =True и закрыто для редактирования
    поле Валюта поставщика selectSupplierCurrency закрыть для редактирования и сделать равным RUB
    поле Скидка от поставщика tbxSupplierDiscountRub закрыть для редактирования и сделать равным 0
    поле Скидка от поставщика, % tbxSupplierDiscountPerc закрыть для редактирования и сделать равным 0
    поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice закрыть для редактирования
    поле Стоимость предмета лизинга без НДС xxx открыть для редактирования
    поле НДС в стоимости предмета лизинга xxx открыть для редактирования

Если в поле Продукт selectProduct  выбрана запись, у которой БУбезНДС evo_sale_without_nds != True, то:
    поле ПЛ БУ cbxLeaseObjectUsed открыто для редактирования (проверить на другие реакции открывающие/закрывающие это поле)
    поле Валюта поставщика selectSupplierCurrency открыто для редактирования
    поле Скидка от поставщика tbxSupplierDiscountRub открыто для редактирования 
    поле Скидка от поставщика, % tbxSupplierDiscountPerc открыто для редактирования 
    поле Стоимость предмета лизинга с НДС tbxLeaseObjectPrice открыто для редактирования
    поле Стоимость предмета лизинга без НДС xxx закрыть для редактирования
    поле НДС в стоимости предмета лизинга xxx закрыть для редактирования
 */
  reaction(
    () => ({
      product: $calculation.getOption('selectProduct'),
      recalcWithRevision: $calculation.values.recalcWithRevision,
    }),
    ({ product }) => {
      if (!product) {
        $calculation.setStatus(
          'tbxSupplierDiscountRub',
          ElementStatus.Disabled,
        );

        $calculation.setStatus(
          'tbxSupplierDiscountPerc',
          ElementStatus.Disabled,
        );

        $calculation.setStatus('tbxLeaseObjectPrice', ElementStatus.Disabled);

        $calculation.setStatus(
          'tbxVATInLeaseObjectPrice',
          ElementStatus.Disabled,
        );
        $calculation.setStatus('selectImportProgram', ElementStatus.Default);
      } else {
        const { evo_sale_without_nds } = product;
        if (evo_sale_without_nds) {
          $calculation.setStatus(
            'tbxSupplierDiscountRub',
            ElementStatus.Disabled,
          );

          $calculation.setStatus(
            'tbxSupplierDiscountPerc',
            ElementStatus.Disabled,
          );

          $calculation.setStatus('tbxLeaseObjectPrice', ElementStatus.Default);

          $calculation.setStatus(
            'tbxVATInLeaseObjectPrice',
            ElementStatus.Default,
          );

          $calculation.setStatus('selectImportProgram', ElementStatus.Disabled);
        } else {
          $calculation.setStatus(
            'tbxSupplierDiscountRub',
            ElementStatus.Default,
          );

          $calculation.setStatus(
            'tbxSupplierDiscountPerc',
            ElementStatus.Default,
          );

          $calculation.setStatus('tbxLeaseObjectPrice', ElementStatus.Default);

          $calculation.setStatus(
            'tbxVATInLeaseObjectPrice',
            ElementStatus.Disabled,
          );

          $calculation.setStatus('selectImportProgram', ElementStatus.Default);
        }
      }
    },
    {
      fireImmediately: true,
    },
  );
  reaction(
    () => $calculation.getOption('selectProduct'),
    product => {
      if ($calculation.stores.calculationProcess.hasProcess(Process.LoadKp))
        return;
      if (!product) {
        $calculation.setValue('supplierDiscountRub', 0);

        $calculation.setValue('supplierDiscountRub', 0);

        $calculation.setValue('leaseObjectPrice', 0);

        $calculation.setValue('leaseObjectPriceWthtVAT', 0);

        $calculation.setValue('VATInLeaseObjectPrice', 0);

        $calculation.setValue('importProgram', null);
      } else {
        const { evo_sale_without_nds } = product;
        if (evo_sale_without_nds) {
          $calculation.setValue('leaseObjectUsed', true);

          $calculation.setValue('supplierDiscountRub', 0);

          $calculation.setValue('supplierDiscountRub', 0);

          $calculation.setValue('importProgram', null);
        }
      }
    },
    {
      fireImmediately: true,
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение поля Пересчет без пересмотра cbxRecalcWithRevision и загрузку КП:
      ЕСЛИ в поле Продукт selectProduct  выбрана запись и поле БУбезНДС evo_sale_without_nds = True 
      и Пересчет без пересмотра cbxRecalcWithRevision = True,

       то поля "Первый платеж, руб." tbxFirstPaymentRub 
       и "Первый платеж %" tbxFirstPaymentPerc закрыты для редактирования,
      иначе открыты для редактирования
   */
  reaction(
    () => $calculation.getValues(['recalcWithRevision', 'quote']),
    ({ recalcWithRevision, quote }) => {
      const product = $calculation.getOption('selectProduct');
      if (product?.evo_sale_without_nds && recalcWithRevision) {
        $calculation.setStatus('tbxFirstPaymentPerc', ElementStatus.Disabled);
        $calculation.setStatus('tbxFirstPaymentRub', ElementStatus.Disabled);
      } else {
        $calculation.setStatus('tbxFirstPaymentPerc', ElementStatus.Default);
        $calculation.setStatus('tbxFirstPaymentRub', ElementStatus.Default);
      }
    },
  );

  /**
   * @description
   * Реакция на изменение ПЛ БУ cbxLeaseObjectUsed  и Тип ПЛ selectLeaseObjectType
   * Если ПЛ БУ cbxLeaseObjectUsed = True и Тип ПЛ selectLeaseObjectType = Спецтехника (id=9) ,
   * то поле Моточасы tbxEngineHours открыто для редактирования, иначе закрыто и равно 0.
   */
  reaction(
    () => {
      const leaseObjectType = $calculation.getOption('selectLeaseObjectType');
      const { leaseObjectUsed } = $calculation.values;
      return {
        leaseObjectUsed,
        leaseObjectType,
      };
    },
    ({ leaseObjectUsed, leaseObjectType }) => {
      if (leaseObjectUsed && leaseObjectType?.evo_id === '9') {
        $calculation.setStatus('tbxEngineHours', ElementStatus.Default);
      } else {
        $calculation.setValue('engineHours', 0);
        $calculation.setStatus('tbxEngineHours', ElementStatus.Disabled);
      }
    },
    {
      fireImmediately: true,
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение Типа ПЛ selectLeaseObjectType , ПЛ БУ cbxLeaseObjectUsed и Моточасы tbxEngineHours:
   * Если ПЛ БУ cbxLeaseObjectUsed = True и Тип ПЛ selectLeaseObjectType = Спецтехника (id=9) и Моточасы = 0,
   * то поле Моточасы tbxEngineHours должно обводиться красной рамкой и выводиться сообщение
   * "Укажите Моточасы, иначе красная рамка снимается.
   * При красной рамке в данном поле нельзя осуществить расчет графика.
   */
  reaction(
    () => {
      const leaseObjectType = $calculation.getOption('selectLeaseObjectType');
      const { leaseObjectUsed, engineHours } = $calculation.values;
      return { leaseObjectUsed, engineHours, leaseObjectType };
    },
    ({ leaseObjectType, leaseObjectUsed, engineHours }) => {
      if (leaseObjectUsed && leaseObjectType?.evo_id === '9' && !engineHours) {
        $calculation.setValidation('tbxEngineHours', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description: 'Укажите Моточасы',
        });
      } else {
        $calculation.setValidation('tbxEngineHours', undefined);
      }
    },
  );

  reaction(
    () => $calculation.getValue('leaseObjectUsed'),
    leaseObjectUsed => {
      if (leaseObjectUsed) {
        $calculation.setStatus('tbxMileage', ElementStatus.Default);
      } else {
        $calculation.setValue('mileage', 0);
        $calculation.setStatus('tbxMileage', ElementStatus.Disabled);
      }
    },
    {
      fireImmediately: true,
    },
  );

  reaction(
    () => {
      const { mileage, leaseObjectUsed } = $calculation.values;
      return { mileage, leaseObjectUsed };
    },
    ({ mileage, leaseObjectUsed }) => {
      if (!mileage && leaseObjectUsed) {
        $calculation.setValidation('tbxMileage', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description: 'Не указан пробег',
        });
      } else {
        $calculation.setValidation('tbxMileage', undefined);
      }
    },
  );

  reaction(
    () => {
      const { leaseObjectUsed } = $calculation.values;
      return leaseObjectUsed;
    },
    leaseObjectUsed => {
      if (leaseObjectUsed === true) {
        $calculation.setValues({
          subsidy: null,
        });
        $calculation.setStatuses({
          selectSubsidy: ElementStatus.Disabled,
        });
      } else {
        $calculation.setStatuses({
          selectSubsidy: ElementStatus.Default,
        });
      }
    },
    {
      fireImmediately: true,
    },
  );

  /**
   * @description
   * реакция на ПЛ БУ, Субсидию и Продукт и Салон
   * если ПЛ БУ = Да или Субсидия содержит данные
   * или в Продукте БУбезНДС = Да,
   * или в selectDealer указан account, у которого evo_return_leasing_dealer === true
   * то поле Срок поставки = 100 000 000 и закрыто для редактирования, иначе открыто для редактирования
   */
  reaction(
    () => {
      const { leaseObjectUsed } = $calculation.values;
      const sudsidy = $calculation.getOption('selectSubsidy');
      const product = $calculation.getOption('selectProduct');
      const dealer = $calculation.getOption('selectDealer');

      return {
        leaseObjectUsed,
        sudsidy,
        product,
        dealer,
      };
    },
    ({ leaseObjectUsed, sudsidy, product, dealer }) => {
      if (
        leaseObjectUsed ||
        sudsidy ||
        product?.evo_sale_without_nds ||
        dealer?.evo_return_leasing_dealer
      ) {
        $calculation.setValue('deliveryTime', 100_000_000);
        $calculation.setStatus('radioDeliveryTime', ElementStatus.Disabled);
      } else {
        $calculation.setStatus('radioDeliveryTime', ElementStatus.Default);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getOption('selectSubsidy');
    },
    subsidy => {
      if (subsidy) {
        $calculation.setValues({
          leaseObjectCount: 1,
          leaseObjectUsed: false,
        });
      }
      $calculation.setStatuses({
        tbxLeaseObjectCount: subsidy
          ? ElementStatus.Disabled
          : ElementStatus.Default,
        cbxLeaseObjectUsed: subsidy
          ? ElementStatus.Disabled
          : ElementStatus.Default,
      });
    },
  );

  /** VIN */

  const vinRegex = /^[A-HJ-NPR-Za-hj-npr-z0-9]+$/;

  reaction(
    () => {
      return {
        ...$calculation.getValues([
          'vin',
          'leaseObjectCategory',
          'leaseObjectUsed',
        ]),
      };
    },
    ({ vin }) => {
      if (vin) {
        if ($calculation.getValue('leaseObjectCategory')) {
          $calculation.setValidation(
            'tbxVIN',
            vin.length === 17 && vinRegex.test(vin),
          );
        } else {
          $calculation.setValidation('tbxVIN', vinRegex.test(vin));
        }
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('leaseObjectUsed');
    },
    leaseObjectUsed => {
      if (leaseObjectUsed) {
        $calculation.setStatus('tbxVIN', ElementStatus.Default);
      } else {
        $calculation.setValue('vin', undefined);
        $calculation.setStatus('tbxVIN', ElementStatus.Disabled);
      }
    },
  );
}
