import { openNotification } from 'client/Elements/Notification';
import { ICalculationStore } from 'core/types/Calculation/Store';
import { reaction } from 'mobx';
import { ElementStatus } from 'types/elements';
import {
  fillCalcBroker,
  fillCalcDoubleAgent,
  fillFinDepartment,
  fillIndAgent,
} from './fill-elements';

export default function agentsReactions($calculation: ICalculationStore) {
  /**
     * @description
     * Добавить реакцию на изменение списка в поле selectDealerRewardCondition :
        Если в списке selectDealerRewardCondition есть запись, 
        у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, 
        то сбрасывают значение и закрываются для выбора поля:

        selectDealerBroker 
        selectIndAgent
        selectCalcDoubleAgent
        selectCalcBroker
        selectFinDepartment
     */

  reaction(
    () => {
      return $calculation.getOptions(
        'selectDealerRewardCondition',
        undefined,
        true,
      );
    },
    dealerRewardConditionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        dealerRewardConditionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('dealerBroker', null);
        $calculation.setValue('indAgent', null);
        $calculation.setValue('calcDoubleAgent', null);
        $calculation.setValue('calcBroker', null);
        $calculation.setValue('calcFinDepartment', null);

        $calculation.setStatus('selectDealerBroker', ElementStatus.Disabled);
        $calculation.setStatus('selectIndAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcDoubleAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcBroker', ElementStatus.Disabled);
        $calculation.setStatus(
          'selectCalcFinDepartment',
          ElementStatus.Disabled,
        );
      } else {
        $calculation.setStatus('selectDealerBroker', ElementStatus.Default);

        const lead = $calculation.getOption('selectLead');
        fillIndAgent.call($calculation, lead);
        fillCalcDoubleAgent.call($calculation, lead);
        fillCalcBroker.call($calculation, lead);
        fillFinDepartment.call($calculation, lead);
      }
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение списка в поле selectDealerBrokerRewardCondition :

    Если в списке selectDealerBrokerRewardCondition есть запись, у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, то сбрасывают значение и закрываются для выбора поля:

    selectDealerPerson (не обнуляем)
    selectIndAgent
    selectCalcDoubleAgent
    selectCalcBroker
    selectFinDepartment
    иначе

    selectDealerPerson открываем для редактирования
    selectIndAgent заполняется значением из Интереса
    selectCalcDoubleAgent заполняется значением из Интереса
    selectCalcBrokerRewardCondition заполняется значением из Интереса
    selectFinDepartmentRewardCondtion заполняется значением из Интереса
   */
  reaction(
    () => {
      return $calculation.getOptions(
        'selectDealerBrokerRewardCondition',
        undefined,
        true,
      );
    },
    dealerBrokerRewardConditionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        dealerBrokerRewardConditionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('indAgent', null);
        $calculation.setValue('calcDoubleAgent', null);
        $calculation.setValue('calcBroker', null);
        $calculation.setValue('calcFinDepartment', null);

        $calculation.setStatus('selectDealerPerson', ElementStatus.Disabled);
        $calculation.setStatus('selectIndAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcDoubleAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcBroker', ElementStatus.Disabled);
        $calculation.setStatus(
          'selectCalcFinDepartment',
          ElementStatus.Disabled,
        );
      } else {
        $calculation.setStatus('selectDealerPerson', ElementStatus.Default);

        //TODO: сделать отдельный запрос на lead (и возможно на опции)
        const lead = $calculation.getOption('selectLead');
        fillIndAgent.call($calculation, lead);
        fillCalcDoubleAgent.call($calculation, lead);
        fillCalcBroker.call($calculation, lead);
        fillFinDepartment.call($calculation, lead);
      }
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение списка в поле selectIndAgentRewardCondition :

    Если в списке selectIndAgentRewardCondition есть запись, у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, то сбрасывают значение и закрываются для выбора поля:

    selectDealerPerson (не обнуляем)
    selectDealerBroker
    selectCalcDoubleAgent
    selectCalcBroker
    selectFinDepartment
    иначе 

    selectDealerPerson открываем для редактирования
    selectDealerBroker открываем для редактирования
    selectCalcDoubleAgent заполняется значением из Интереса
    selectCalcBroker заполняется значением из Интереса
    selectCalcFinDepartment заполняется значением из Интереса
   */
  reaction(
    () => {
      return $calculation.getOptions(
        'selectIndAgentRewardCondition',
        undefined,
        true,
      );
    },
    indAgentRewardConditionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        indAgentRewardConditionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('dealerBroker', null);
        $calculation.setValue('calcDoubleAgent', null);
        $calculation.setValue('calcBroker', null);
        $calculation.setValue('calcFinDepartment', null);

        $calculation.setStatus('selectDealerPerson', ElementStatus.Disabled);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcDoubleAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcBroker', ElementStatus.Disabled);
        $calculation.setStatus(
          'selectCalcFinDepartment',
          ElementStatus.Disabled,
        );
      } else {
        $calculation.setStatus('selectDealerPerson', ElementStatus.Default);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Default);

        //TODO: сделать отдельный запрос на lead (и возможно на опции)
        const lead = $calculation.getOption('selectLead');
        fillCalcDoubleAgent.call($calculation, lead);
        fillCalcBroker.call($calculation, lead);
        fillFinDepartment.call($calculation, lead);
      }
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение списка в поле selectCalcDoubleAgentRewardCondition :

    Если в списке selectCalcDoubleAgentRewardCondition есть запись, у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, то сбрасывают значение и закрываются для выбора поля:

    selectDealerPerson (не обнуляем)
    selectDealerBroker
    selectIndAgent
    selectCalcBroker
    selectCalcFinDepartment
    иначе

    selectDealerPerson открываем для редактирования
    selectDealerBroker открываем для редактирования
    selectIndAgent заполняется значением из Интереса
    selectCalcBroker заполняется значением из Интереса
    selectCalcFinDepartment заполняется значением из Интереса
   */
  reaction(
    () => {
      return $calculation.getOptions(
        'selectCalcDoubleAgentRewardCondition',
        undefined,
        true,
      );
    },
    calcDoubleAgentRewardConditionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        calcDoubleAgentRewardConditionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('dealerBroker', null);
        $calculation.setValue('indAgent', null);
        $calculation.setValue('calcBroker', null);
        $calculation.setValue('calcFinDepartment', null);

        $calculation.setStatus('selectDealerPerson', ElementStatus.Disabled);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Disabled);
        $calculation.setStatus('selectIndAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcBroker', ElementStatus.Disabled);
        $calculation.setStatus(
          'selectCalcFinDepartment',
          ElementStatus.Disabled,
        );
      } else {
        $calculation.setStatus('selectDealerPerson', ElementStatus.Default);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Default);

        //TODO: сделать отдельный запрос на lead (и возможно на опции)
        const lead = $calculation.getOption('selectLead');
        fillIndAgent.call($calculation, lead);
        fillCalcBroker.call($calculation, lead);
        fillFinDepartment.call($calculation, lead);
      }
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение списка в поле selectCalcBrokerRewardCondition:

    Если в списке selectCalcBrokerRewardCondition есть запись, у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, то сбрасывают значение и закрываются для выбора поля:

    selectDealerPerson (не обнуляем)
    selectDealerBroker
    selectIndAgent
    selectCalcDoubleAgent
    selectCalcFinDepartment
    иначе

    selectDealerPerson открываем для редактирования
    selectDealerBroker открываем для редактирования
    selectIndAgent заполняется значением из Интереса
    selectCalcDoubleAgent заполняется значением из Интереса
    selectCalcFinDepartment заполняется значением из Интереса
   */
  reaction(
    () => {
      return $calculation.getOptions(
        'selectCalcBrokerRewardCondition',
        undefined,
        true,
      );
    },
    calcBrokerRewardConditionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        calcBrokerRewardConditionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('dealerBroker', null);
        $calculation.setValue('indAgent', null);
        $calculation.setValue('calcDoubleAgent', null);
        $calculation.setValue('calcFinDepartment', null);

        $calculation.setStatus('selectDealerPerson', ElementStatus.Disabled);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Disabled);
        $calculation.setStatus('selectIndAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcDoubleAgent', ElementStatus.Disabled);
        $calculation.setStatus(
          'selectCalcFinDepartment',
          ElementStatus.Disabled,
        );
      } else {
        $calculation.setStatus('selectDealerPerson', ElementStatus.Default);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Default);

        //TODO: сделать отдельный запрос на lead (и возможно на опции)
        const lead = $calculation.getOption('selectLead');
        fillIndAgent.call($calculation, lead);
        fillCalcDoubleAgent.call($calculation, lead);
        fillFinDepartment.call($calculation, lead);
      }
    },
  );

  /**
   * @description
   * Добавить реакцию на изменение списка в поле selectFinDepartmentRewardCondtion:

    Если в списке selectFinDepartmentRewardCondtion есть запись, у которой evo_reward_condition.evo_agency_agreementid. Выплата без других агентов (evo_reward_without_other_agent) = True, то сбрасывают значение и закрываются для выбора поля:

    selectDealerPerson (не обнуляем)
    selectDealerBroker
    selectIndAgent
    selectCalcDoubleAgent
    selectCalcBroker
    иначе

    selectDealerPerson открываем для редактирования
    selectDealerBroker открываем для редактирования
    selectIndAgent заполняется значением из Интереса
    selectCalcDoubleAgent заполняется значением из Интереса
    selectCalcBroker заполняется значением из Интереса
   */
  reaction(
    () => {
      return $calculation.getOptions(
        'selectFinDepartmentRewardCondtion',
        undefined,
        true,
      );
    },
    finDepartmentRewardCondtionOptions => {
      // TODO: отдельный запрос evo_agency_agreement по id
      if (
        finDepartmentRewardCondtionOptions?.some(
          x =>
            x.evo_agency_agreementidData?.evo_reward_without_other_agent ===
            true,
        )
      ) {
        $calculation.setValue('dealerBroker', null);
        $calculation.setValue('indAgent', null);
        $calculation.setValue('calcDoubleAgent', null);
        $calculation.setValue('calcBroker', null);

        $calculation.setStatus('selectDealerPerson', ElementStatus.Disabled);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Disabled);
        $calculation.setStatus('selectIndAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcDoubleAgent', ElementStatus.Disabled);
        $calculation.setStatus('selectCalcBroker', ElementStatus.Disabled);
      } else {
        $calculation.setStatus('selectDealerPerson', ElementStatus.Default);
        $calculation.setStatus('selectDealerBroker', ElementStatus.Default);

        //TODO: сделать отдельный запрос на lead (и возможно на опции)
        const lead = $calculation.getOption('selectLead');
        fillIndAgent.call($calculation, lead);
        fillCalcDoubleAgent.call($calculation, lead);
        fillCalcBroker.call($calculation, lead);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('dealerRewardSumm');
    },
    dealerRewardSumm => {
      const dealerRewardCondition = $calculation.getOption(
        'selectDealerRewardCondition',
      );
      if (
        dealerRewardCondition?.evo_reward_summ &&
        dealerRewardSumm > dealerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxDealerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение ЮЛ поставщика указано больше условия по агентскому договору!',
        });
      } else if (
        !dealerRewardCondition?.evo_reduce_reward &&
        dealerRewardCondition?.evo_reward_summ &&
        dealerRewardSumm < dealerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxDealerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение ЮЛ поставщика указано меньше условия по агентскому договору!',
        });
      } else if (
        dealerRewardCondition?.evo_min_reward_summ &&
        dealerRewardSumm < dealerRewardCondition?.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxDealerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение ЮЛ поставщика указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxDealerRewardSumm', true);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('dealerBrokerRewardSumm');
    },
    dealerBrokerRewardSumm => {
      const dealerBrokerRewardCondition = $calculation.getOption(
        'selectDealerBrokerRewardCondition',
      );
      if (
        dealerBrokerRewardCondition?.evo_reward_summ &&
        dealerBrokerRewardSumm > dealerBrokerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxDealerBrokerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение брокера поставщика указано больше условия по агентскому договору!',
        });
      } else if (
        !dealerBrokerRewardCondition?.evo_reduce_reward &&
        dealerBrokerRewardCondition?.evo_reward_summ &&
        dealerBrokerRewardSumm < dealerBrokerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxDealerBrokerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение брокера поставщика указано меньше условия по агентскому договору!',
        });
      } else if (
        dealerBrokerRewardCondition?.evo_min_reward_summ &&
        dealerBrokerRewardSumm < dealerBrokerRewardCondition.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxDealerBrokerRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение Брокера поставщика указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxDealerBrokerRewardSumm', true);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('indAgentRewardSumm');
    },
    indAgentRewardSumm => {
      const indAgentRewardCondition = $calculation.getOption(
        'selectIndAgentRewardCondition',
      );
      if (
        indAgentRewardCondition?.evo_reward_summ &&
        indAgentRewardSumm > indAgentRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxIndAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение агента ФЛ указано больше условия по агентскому договору!',
        });
      } else if (
        !indAgentRewardCondition?.evo_reduce_reward &&
        indAgentRewardCondition?.evo_reward_summ &&
        indAgentRewardSumm < indAgentRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxIndAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение агента ФЛ указано меньше условия по агентскому договору!',
        });
      } else if (
        indAgentRewardCondition?.evo_min_reward_summ &&
        indAgentRewardSumm < indAgentRewardCondition.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxIndAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение агента ФЛ указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxIndAgentRewardSumm', true);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('calcDoubleAgentRewardSumm');
    },
    calcDoubleAgentRewardSumm => {
      const selectCalcDoubleAgentRewardCondition = $calculation.getOption(
        'selectCalcDoubleAgentRewardCondition',
      );
      if (
        selectCalcDoubleAgentRewardCondition?.evo_reward_summ &&
        calcDoubleAgentRewardSumm >
          selectCalcDoubleAgentRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxCalcDoubleAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение двойного агента указано больше условия по агентскому договору!',
        });
      } else if (
        !selectCalcDoubleAgentRewardCondition?.evo_reduce_reward &&
        selectCalcDoubleAgentRewardCondition?.evo_reward_summ &&
        calcDoubleAgentRewardSumm <
          selectCalcDoubleAgentRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxCalcDoubleAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение двойного агента указано меньше условия по агентскому договору!',
        });
      } else if (
        selectCalcDoubleAgentRewardCondition?.evo_min_reward_summ &&
        calcDoubleAgentRewardSumm <
          selectCalcDoubleAgentRewardCondition.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxCalcDoubleAgentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение двойного агента указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxCalcDoubleAgentRewardSumm', true);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('calcBrokerRewardSum');
    },
    calcBrokerRewardSum => {
      const selectCalcBrokerRewardCondition = $calculation.getOption(
        'selectCalcBrokerRewardCondition',
      );
      if (
        selectCalcBrokerRewardCondition?.evo_reward_summ &&
        calcBrokerRewardSum > selectCalcBrokerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxCalcBrokerRewardSum', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение брокера указано больше условия по агентскому договору!',
        });
      } else if (
        !selectCalcBrokerRewardCondition?.evo_reduce_reward &&
        selectCalcBrokerRewardCondition?.evo_reward_summ &&
        calcBrokerRewardSum < selectCalcBrokerRewardCondition.evo_reward_summ
      ) {
        $calculation.setValidation('tbxCalcBrokerRewardSum', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение брокера указано меньше условия по агентскому договору!',
        });
      } else if (
        selectCalcBrokerRewardCondition?.evo_min_reward_summ &&
        calcBrokerRewardSum <
          selectCalcBrokerRewardCondition?.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxCalcBrokerRewardSum', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение брокера указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxCalcBrokerRewardSum', true);
      }
    },
  );

  reaction(
    () => {
      return $calculation.getValue('finDepartmentRewardSumm');
    },
    finDepartmentRewardSumm => {
      const selectFinDepartmentRewardCondtion = $calculation.getOption(
        'selectFinDepartmentRewardCondtion',
      );

      if (
        selectFinDepartmentRewardCondtion?.evo_reward_summ &&
        finDepartmentRewardSumm >
          selectFinDepartmentRewardCondtion?.evo_reward_summ
      ) {
        $calculation.setValidation('tbxFinDepartmentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение финотдела указано больше условия по агентскому договору!',
        });
      } else if (
        selectFinDepartmentRewardCondtion?.evo_reward_summ &&
        !selectFinDepartmentRewardCondtion.evo_reduce_reward &&
        finDepartmentRewardSumm <
          selectFinDepartmentRewardCondtion.evo_reward_summ
      ) {
        $calculation.setValidation('tbxFinDepartmentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение финотдела указано меньше условия по агентскому договору!',
        });
      } else if (
        selectFinDepartmentRewardCondtion?.evo_min_reward_summ &&
        finDepartmentRewardSumm <
          selectFinDepartmentRewardCondtion?.evo_min_reward_summ
      ) {
        $calculation.setValidation('tbxFinDepartmentRewardSumm', false);
        openNotification({
          type: 'error',
          message: 'Ошибка',
          description:
            'Вознаграждение финотдела указано меньше условия по агентскому договору!',
        });
      } else {
        $calculation.setValidation('tbxFinDepartmentRewardSumm', true);
      }
    },
  );
}
