import { ICalculationStore } from 'core/types/Calculation/Store';
import { reaction } from 'mobx';
import { ElementStatus } from 'types/elements';

export default function ($calculation: ICalculationStore) {
  /**
   * @description
   * на изменение selectProduct, selectSubsidy или selectImportProgram
если selectSusidy или selectImportProgram содержит данные, то selectSupplierCurrency закрыта для редактирования,
иначе
      если selectProduct не содержит данные, то selectSupplierCurrency закрыта для редактирования, иначе
      если (в поле Продукт selectProduct  выбрана запись, у которой БУбезНДС evo_sale_without_nds = True),
       то selectSupplierCurrency закрыта для редактирования
      иначе selectSupplierCurrency открыто для редактирования
   */

  reaction(
    () => {
      const product = $calculation.getOption('selectProduct');
      const { subsidy, importProgram } = $calculation.values;
      const dealer = $calculation.getOption('selectDealer');
      return { product, subsidy, importProgram, dealer };
    },
    ({ product, subsidy, importProgram, dealer }) => {
      const supplierCurrency =
        $calculation.options.selectSupplierCurrency?.find(
          x => x.isocurrencycode === 'RUB',
        );
      if (
        subsidy ||
        importProgram ||
        dealer?.evo_return_leasing_dealer === true
      ) {
        $calculation.setValue(
          'supplierCurrency',
          supplierCurrency?.transactioncurrencyid,
        );
      } else if (!product) {
        $calculation.setValue(
          'supplierCurrency',
          supplierCurrency?.transactioncurrencyid,
        );
      } else {
        if (product.evo_sale_without_nds) {
          $calculation.setValue(
            'supplierCurrency',
            supplierCurrency?.transactioncurrencyid,
          );
        }
      }
    },
  );

  /**
   * @description
   * на изменение selectProduct, selectSubsidy или selectImportProgram или selectDealer
если selectSusidy или selectItProgram содержит данные или в поле selectDealer указан account, у которого evo_return_leasing_dealer = true, то selectSupplierCurrency закрыта для редактирования,
иначе
если selectProduct не содержит данные, то selectSupplierCurrency закрыта для редактирования, иначе
если (в поле Продукт selectProduct  выбрана запись, у которой БУбезНДС evo_sale_without_nds = True), то selectSupplierCurrency закрыта для редактирования
иначе selectSupplierCurrency открыто для редактирования
   */
  reaction(
    () => {
      const product = $calculation.getOption('selectProduct');
      const { subsidy, importProgram } = $calculation.values;
      const dealer = $calculation.getOption('selectDealer');
      return { product, subsidy, importProgram, dealer };
    },
    ({ product, subsidy, importProgram, dealer }) => {
      if (
        subsidy ||
        importProgram ||
        dealer?.evo_return_leasing_dealer === true
      ) {
        $calculation.setStatus(
          'selectSupplierCurrency',
          ElementStatus.Disabled,
        );
      } else if (!product) {
        $calculation.setStatus(
          'selectSupplierCurrency',
          ElementStatus.Disabled,
        );
      } else {
        if (product.evo_sale_without_nds) {
          $calculation.setStatus(
            'selectSupplierCurrency',
            ElementStatus.Disabled,
          );
        } else {
          $calculation.setStatus(
            'selectSupplierCurrency',
            ElementStatus.Default,
          );
        }
      }
    },
  );
  /**
 * @description
 * При изменении "Программа от производителя" selectImportProgram (работает при загрузке КП)
Если поле "Программа от производителя" selectImportProgram не содержит данные, 
то поле "Стоимость доп.оборудования" tbxAddEquipmentPrice закрыть для редактирования и значение равно 0,
 иначе оставлять открытым для редактирования
 */
  reaction(
    () => $calculation.getValue('importProgram'),
    importProgram => {
      if (!importProgram) {
        $calculation.setStatus('tbxAddEquipmentPrice', ElementStatus.Disabled);
        $calculation.setValue('addEquipmentPrice', 0);
      } else {
        $calculation.setStatus('tbxAddEquipmentPrice', ElementStatus.Default);
      }
    },
  );
}
