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

export default function ($calculation: ICalculationStore) {
  /**
   * @description
   * При изменении значения необходимо значение поля tbxSaleBonus сравнивать со значением из записи Коэффициент
   * для расчета evo_coefficient как сейчас + данная запись должна быть связана с Продуктом product
   * из поля Продукт selectProduct evo_evo_coefficient_evo_baseproduct
   * Если продукта нет или нет коэффициента по условиям, то поле tbxSaleBonus = 0 и закрыто для редактирования
   */

  reaction(
    () => {
      return $calculation.getValue('product');
    },
    product => {
      $calculation.setStatus('tbxSaleBonus', ElementStatus.Default);
      const systemuser = $calculation.getStaticData('systemuser');

      if (systemuser && product) {
        const evo_sot_coefficient_type = $calculation
          .getStaticData('evo_sot_coefficient_type')
          .find(x => x.evo_id === 'BONUS_LEASING');
        const evo_coefficient_bonus = $calculation
          .getStaticData('evo_coefficient')
          .find(
            x =>
              x.evo_job_titleid === systemuser[0].evo_job_titleid &&
              x.evo_sot_coefficient_typeid ===
                evo_sot_coefficient_type?.evo_sot_coefficient_typeid &&
              x.evo_baseproducts?.map(x => x.evo_id).includes(product),
          );

        if (evo_coefficient_bonus?.evo_sot_coefficient) {
          $calculation.setValue(
            'saleBonus',
            evo_coefficient_bonus?.evo_sot_coefficient * 100,
          );

          $calculation.setStatus('tbxSaleBonus', ElementStatus.Default);
        } else {
          $calculation.setValue('saleBonus', 0);
          $calculation.setStatus('tbxSaleBonus', ElementStatus.Disabled);
        }
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValues(['saleBonus', 'product']);
    },
    ({ saleBonus, product }) => {
      $calculation.setValidation('tbxSaleBonus', undefined);
      const systemuser = $calculation.getStaticData('systemuser');

      if (systemuser && product) {
        const evo_sot_coefficient_type = $calculation
          .getStaticData('evo_sot_coefficient_type')
          .find(x => x.evo_id === 'BONUS_LEASING');
        const evo_coefficient_bonus = $calculation
          .getStaticData('evo_coefficient')
          .find(
            x =>
              x.evo_job_titleid === systemuser[0].evo_job_titleid &&
              x.evo_sot_coefficient_typeid ===
                evo_sot_coefficient_type?.evo_sot_coefficient_typeid &&
              x.evo_baseproducts?.map(x => x.evo_id).includes(product),
          );

        if (evo_coefficient_bonus?.evo_sot_coefficient) {
          const max_sale_bonus =
            evo_coefficient_bonus.evo_sot_coefficient * 100;
          if (round(saleBonus, 2) > round(max_sale_bonus, 2)) {
            $calculation.setValidation('tbxSaleBonus', false);
            openNotification({
              type: 'error',
              message: 'Ошибка',
              description:
                'Размер бонуса МПЛ не может быть выше установленного по СОТ',
            });
            return;
          } else {
            $calculation.setValidation('tbxSaleBonus', undefined);
          }
        }
      }
    },
  );

  /**
   * @description
   * если в Продукте evo_cut_proportion_bonus_director " = Да,
   * то tbxBonusCoefficient = tbxSaleBonus/evo_sot_coefficient,
   * иначе tbxBonusCoefficient = 1
   * где evo_sot_coefficient ищем так:
   * в справочнике Коэффициент для расчета (evo_coefficient) найти запись, у которой:
   * 
Тип коэффициента (evo_corfficient_type) = СОТ (100 000 002)
Статус (statecode) =  активный (0)
Начало действия (evo_datefrom) меньше или равно текущей даты
Окончание действия (evo_dateto) больше или равно текущей даты
Должность (evo_evo_job_title_evo_coefficient_job_titleid) = Должности (evo_job_titleid) текущего пользователя (systemuser)
Тип коэффициента для СОТ (evo_sot_coefficient_typeid) =  (evo_sot_coefficient_type.evo_id=BONUS_LEASING)
данная запись должна быть связана с Продуктом product из поля Продукт selectProduct
   */

  reaction(
    () => {
      const { saleBonus } = $calculation.values;
      const product = $calculation.getOption('selectProduct');
      return {
        saleBonus,
        product,
      };
    },
    ({ saleBonus, product }) => {
      if (product?.evo_cut_proportion_bonus_director === true) {
        const systemuser = $calculation.getStaticData('systemuser');
        const evo_sot_coefficient_type = $calculation
          .getStaticData('evo_sot_coefficient_type')
          .find(x => x.evo_id === 'BONUS_LEASING');
        const evo_coefficient_bonus = $calculation
          .getStaticData('evo_coefficient')
          .find(
            x =>
              x.evo_job_titleid === systemuser[0].evo_job_titleid &&
              x.evo_sot_coefficient_typeid ===
                evo_sot_coefficient_type?.evo_sot_coefficient_typeid &&
              x.evo_baseproducts?.map(x => x.evo_id).includes(product.evo_id),
          );
        const max_sale_bonus =
          (evo_coefficient_bonus?.evo_sot_coefficient || 0) * 100;
        if (max_sale_bonus) {
          $calculation.setValue('bonusCoefficient', saleBonus / max_sale_bonus);
        } else {
          $calculation.setValue('bonusCoefficient', 0);
        }
      } else {
        $calculation.setValue('bonusCoefficient', 1);
      }
    },
  );
}
