import { useMutation, useQuery } from 'react-query';

import { AxiosError } from 'axios';

import { queryClient } from 'src/config/react-query';
import { useLokaliseTranslation } from 'src/utils/i18n';
import { LogEvents, logEvent } from 'src/utils/logging';

import { serviceManagementKeys } from '../queries';
import {
  createDefaultStates,
  getModuleConfiguration,
  updateModuleConfiguration,
} from '../services';
import { ModuleConfiguration, ServiceManagementRole } from '../types';

import useSnackbar from './useSnackbar';

const useModuleConfiguration = () => {
  const { t } = useLokaliseTranslation('service_management');
  const { showSnackbar } = useSnackbar();

  const { data: moduleConfiguration, isLoading: isLoadingModuleConfiguration } =
    useQuery(
      serviceManagementKeys.configuration(),
      () => getModuleConfiguration(),
      {
        select: response => response.data,
        onError: (error: AxiosError) => {
          if (error.response?.status !== 404) {
            showSnackbar({
              title: t('error_loading_configuration'),
              variant: 'error',
            });
          }
        },
        refetchOnMount: false,
        refetchOnWindowFocus: false,
      },
    );

  const updateConfigurationMutation = useMutation(
    (newConfig: Partial<ModuleConfiguration>) =>
      updateModuleConfiguration(newConfig),
    {
      onSuccess: res => {
        queryClient.setQueryData(serviceManagementKeys.configuration(), res);
        showSnackbar({
          title: t('configuration_update_success'),
          variant: 'success',
        });
      },
      onError: () => {
        showSnackbar({
          title: t('configuration_update_error'),
          variant: 'error',
        });
      },
    },
  );

  const createDefaultStatesMutation = useMutation(() => createDefaultStates(), {
    onSuccess: () => {
      queryClient.invalidateQueries(serviceManagementKeys.configuration());
      showSnackbar({
        title: t('configuration_update_success'),
        variant: 'success',
      });
      logEvent(LogEvents.SERVICE_MGMT_MODULE_ACTIVATE, {
        role: ServiceManagementRole.ADMIN,
      });
    },
    onError: () => {
      showSnackbar({
        title: t('configuration_update_error'),
        variant: 'error',
      });
    },
  });

  const moduleActivated = moduleConfiguration?.stateMachineEnabled ?? false;

  return {
    moduleConfiguration,
    isLoadingModuleConfiguration,
    updateConfigurationMutation,
    createDefaultStatesMutation,
    moduleActivated,
  };
};

export default useModuleConfiguration;
