/* eslint-disable import/prefer-default-export */
import { gql, useApolloClient } from '@apollo/client';
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import { useEffect } from 'react';
import { useStore } from 'stores/hooks';

dayjs.extend(utc);

const QUERY_GET_MAIN_OPTIONS = gql`
  query GetMainOptions($currentDate: DateTime) {
    selectSupplierCurrency: transactioncurrencies {
      label: currencyname
      currencysymbol
      value: transactioncurrencyid
    }

    selectProduct: evo_baseproducts(
      statecode: 0
      evo_relation: [100000000]
      evo_datefrom_param: { lte: $currentDate }
      evo_dateto_param: { gte: $currentDate }
    ) {
      label: evo_name
      value: evo_baseproductid
    }

    selectLeaseObjectType: evo_leasingobject_types(statecode: 0) {
      label: evo_name
      value: evo_leasingobject_typeid
    }

    selectGPSBrand: evo_gps_brands(statecode: 0) {
      label: evo_name
      value: evo_gps_brandid
    }
  }
`;

const QUERY_GET_SUBSIDIES = gql`
  query GetSubsidies($currentDate: DateTime) {
    evo_subsidies(
      statecode: 0
      evo_datefrom_param: { lte: $currentDate }
      evo_dateto_param: { gte: $currentDate }
    ) {
      label: evo_name
      value: evo_subsidyid
      evo_subsidy_type
    }
  }
`;

const QUERY_GET_REGIONS = gql`
  query GetRegions {
    evo_regions {
      label: evo_name
      value: evo_regionid
    }
  }
`;

const QUERY_GET_BRANDS = gql`
  query GetBrands {
    selectBrand: evo_brands(statecode: 0) {
      label: evo_name
      value: evo_brandid
    }
  }
`;

const QUERY_GET_DEALERS = gql`
  query GetDealers {
    selectDealer: accounts(evo_account_type: [100000001], statecode: 0, evo_legal_form: 100000001) {
      label: name
      value: accountid
    }
  }
`;

const QUERY_GET_ADDPRODUCT_TYPES = gql`
  query GetAddproductTypes {
    evo_addproduct_types(statecode: 0) {
      label: evo_name
      value: evo_addproduct_typeid
      evo_graph_price
      evo_product_type
    }
  }
`;

const currentDate = dayjs().utc(false).toISOString();

function getMainData(query, onCompleted) {
  query({
    query: QUERY_GET_MAIN_OPTIONS,
    variables: {
      currentDate,
    },
  }).then(({ data }) => {
    onCompleted(data);
  });

  query({
    query: QUERY_GET_SUBSIDIES,
    variables: {
      currentDate,
    },
  }).then(({ data }) => {
    const selectSubsidy = data?.evo_subsidies?.filter(
      (x) => x?.evo_subsidy_type && [100_000_000, 100_000_001].includes(x?.evo_subsidy_type)
    );

    const selectImportProgram = data?.evo_subsidies?.filter(
      (x) => x?.evo_subsidy_type && [100_000_002].includes(x?.evo_subsidy_type)
    );

    onCompleted({
      selectSubsidy,
      selectImportProgram,
    });
  });

  query({
    query: QUERY_GET_REGIONS,
  }).then(({ data }) => {
    const selectRegionRegistration = data?.evo_regions;
    const selectObjectRegionRegistration = data?.evo_regions;
    const selectLegalClientRegion = data?.evo_regions;

    onCompleted({
      selectRegionRegistration,
      selectObjectRegionRegistration,
      selectLegalClientRegion,
    });
  });

  query({
    query: QUERY_GET_BRANDS,
  }).then(({ data }) => {
    onCompleted(data);
  });

  query({
    query: QUERY_GET_DEALERS,
  }).then(({ data }) => {
    onCompleted(data);
  });

  query({
    query: QUERY_GET_ADDPRODUCT_TYPES,
  }).then(({ data }) => {
    const selectRegistration = data.evo_addproduct_types
      ?.filter((x) => x?.evo_product_type === 100_000_001)
      .map((x) => ({
        ...x,
        label: `${x?.label} (${x?.evo_graph_price} руб.)`,
      }));

    const selectTechnicalCard = data.evo_addproduct_types
      ?.filter((x) => x?.evo_product_type === 100_000_000)
      .map((x) => ({
        ...x,
        label: `${x?.label} (${x?.evo_graph_price} руб.)`,
      }));

    const selectTelematic = data.evo_addproduct_types
      ?.filter((x) => x?.evo_product_type === 100_000_004)
      .map((x) => ({
        ...x,
        label: `${x?.label} (${x?.evo_graph_price} руб.)`,
      }));

    const selectTracker = data.evo_addproduct_types
      ?.filter((x) => x?.evo_product_type === 100_000_003)
      .map((x) => ({
        ...x,
        label: `${x?.label} (${x?.evo_graph_price} руб.)`,
      }));

    const selectInsNSIB = data.evo_addproduct_types?.filter(
      (x) => x?.evo_product_type === 100_000_002
    );

    onCompleted({
      selectRegistration,
      selectTechnicalCard,
      selectTelematic,
      selectTracker,
      selectInsNSIB,
    });
  });
}

export function useMainData() {
  const { $calculation } = useStore();
  const { query } = useApolloClient();

  function handleOnCompleted(options) {
    Object.keys(options).forEach((elementName) => {
      const elementOptions = options[elementName];
      $calculation.element(elementName).setOptions(elementOptions);
    });
  }

  useEffect(() => {
    getMainData(query, handleOnCompleted);
  }, []);
}
