/* eslint-disable import/prefer-default-export */
import type { ApolloClient, DocumentNode } from '@apollo/client';
import { gql } from '@apollo/client';
import type { Elements } from 'Components/Calculation/config/map/values';
import type { GetAgentQuery, GetAgentQueryVariables } from 'gql/crm.types';
import type RootStore from 'stores/root';
import { normalizeOptions } from 'tools/entity';
import { QUERY_GET_AGENT } from './query';

function makeFillAgentFromLead(
  elementName: Elements,
  queryGetAgentId: DocumentNode,
  queryGetAgent: DocumentNode
) {
  return async function fillAgentFromLead(
    { $calculation }: RootStore,
    apolloClient: ApolloClient<object>,
    leadid: string | null
  ) {
    if (!leadid) {
      $calculation.element(elementName).reset();

      return;
    }

    const {
      data: { lead },
    } = await apolloClient.query({
      query: queryGetAgentId,
      variables: {
        leadid,
      },
    });

    if (lead?.agentid) {
      const {
        data: { agent },
      } = await apolloClient.query<GetAgentQuery, GetAgentQueryVariables>({
        query: queryGetAgent,
        variables: {
          agentid: lead.agentid,
        },
      });

      if (agent) {
        $calculation
          .element(elementName)
          .setOptions(normalizeOptions([agent]))
          .setValue(agent.value);
      }
    } else {
      $calculation.element(elementName).reset();
    }
  };
}

/**
 * Если lead содержит данные,
 * то indAgent заполняется ссылкой на карточку Контрагент (account),
 * записанную в поле Интереса "Агент" (lead.evo_agent_accountid → account),
 * иначе очищать поле калькулятора indAgent
 */
const QUERY_GET_AGENT_ACCOUNTID_FROM_LEAD = gql`
  query GetAgentAccountIdFromLead($leadid: Uuid!) {
    lead(leadid: $leadid) {
      agentid: evo_agent_accountid
    }
  }
`;

export const fillIndAgent = makeFillAgentFromLead(
  'selectIndAgent',
  QUERY_GET_AGENT_ACCOUNTID_FROM_LEAD,
  QUERY_GET_AGENT
);

/**
 * Если lead содержит данные,
 * то calcDoubleAgent заполняется ссылкой на карточку Контрагент (account),
 * записанную в поле Интереса "Двойной агент" (lead.evo_double_agent_accountid → account)
 * иначе очищать поле калькулятора calcDoubleAgent
 */

const QUERY_GET_DOUBLE_AGENT_ACCOUNTID = gql`
  query GetDoubleAgentAccountId($leadid: Uuid!) {
    lead(leadid: $leadid) {
      agentid: evo_double_agent_accountid
    }
  }
`;

export const fillCalcDoubleAgent = makeFillAgentFromLead(
  'selectCalcDoubleAgent',
  QUERY_GET_DOUBLE_AGENT_ACCOUNTID,
  QUERY_GET_AGENT
);

/**
 * Если lead содержит данные, то calcBroker заполняется ссылкой на карточку Контрагент (account),
 * записанную в поле Интереса "Брокер" (lead.evo_broker_accountid → account)
 * иначе очищать поле калькулятора calcBroker
 */

const QUERY_GET_BROKER_ACCOUNTID_FROM_LEAD = gql`
  query GetBrokerAccountId($leadid: Uuid!) {
    lead(leadid: $leadid) {
      agentid: evo_broker_accountid
    }
  }
`;

export const fillCalcBroker = makeFillAgentFromLead(
  'selectCalcBroker',
  QUERY_GET_BROKER_ACCOUNTID_FROM_LEAD,
  QUERY_GET_AGENT
);

/**
 * если lead содержит данные, то calcFinDepartment заполняется ссылкой
 * на карточку Контрагент (account),
 * записанную в поле Интереса "Финотдел" (lead.evo_fin_department_accountid → account)
 * иначе очищать поле калькулятора calcFinDepartment
 */

const QUERY_GET_FIN_DEPARTMENT_ACCOUNTID = gql`
  query GetFinDepartmentAccountId($leadid: Uuid!) {
    lead(leadid: $leadid) {
      agentid: evo_fin_department_accountid
    }
  }
`;

export const fillFinDepartment = makeFillAgentFromLead(
  'selectCalcFinDepartment',
  QUERY_GET_FIN_DEPARTMENT_ACCOUNTID,
  QUERY_GET_AGENT
);
