import { FC } from 'react';

import { useModal } from '@material-hu/hooks/useModal';
import { IconPencil, IconTrash, IconEye } from '@material-hu/icons/tabler';
import Stack from '@material-hu/mui/Stack';

import HuMenuList from '@material-hu/components/composed-components/MenuList';
import HuDialog from '@material-hu/components/design-system/Dialog';

import useHuGoTheme from 'src/hooks/useHuGoTheme';
import { Criteria, CriteriaType } from 'src/types/audience';
import { insertIf } from 'src/utils/arrayUtils';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { useCriteria } from 'src/components/Audience/criteriaContext';
import useCriteriaSelection from 'src/components/Audience/hooks/useCriteriaSelection';
import { useCriteriaColaborators } from 'src/components/Audience/SeeCollaborators';

import {
  QueryKeys,
  SegmentationCriteriaService,
} from './hooks/useSegmentationCriteria';

type CriteriaMenuProps = {
  criteria: Criteria;
  customGetIndividualCriteriaUsers?: SegmentationCriteriaService['customGetIndividualCriteriaUsers'];
  customKeyIndividualCriteriaUsers?: QueryKeys['customKeyIndividualCriteriaUsers'];
  excludeDeactivatedUsersFromCollaboratorQueries?: boolean;
};

const CriteriaMenu: FC<CriteriaMenuProps> = props => {
  const { criteria, excludeDeactivatedUsersFromCollaboratorQueries = false } =
    props;

  const HuGoThemeProvider = useHuGoTheme();
  const { t } = useLokaliseTranslation(['audience']);
  const { deleteCriteriaSelected, creatingTemplate } = useCriteria();

  const {
    modal: deleteCriteriaModal,
    showModal: showDeleteCriteriaModal,
    closeModal: closeDeleteCriteriaModal,
  } = useModal(() => (
    <HuDialog
      title={t('delete_criteria_question')}
      textBody={t('delete_criteria_description')}
      primaryButtonProps={{
        children: t('general:delete'),
        onClick: () => {
          deleteCriteriaSelected(criteria);
          closeDeleteCriteriaModal();
        },
      }}
      secondaryButtonProps={{
        children: t('general:cancel'),
        onClick: closeDeleteCriteriaModal,
      }}
      onClose={closeDeleteCriteriaModal}
    />
  ));

  const {
    showDrawer: showCollabsInSegmentations,
    drawer: collabsInSegmentations,
  } = useCriteriaColaborators({
    customGetIndividualCriteriaUsers: props?.customGetIndividualCriteriaUsers,
    customKeyIndividualCriteriaUsers: props?.customKeyIndividualCriteriaUsers,
    criteria,
    excludeDeactivatedUsers: excludeDeactivatedUsersFromCollaboratorQueries,
  });

  const { showDrawer: showCriteriaSelection, drawer: criteriaSelectionDrawer } =
    useCriteriaSelection({
      criteria,
      customGetIndividualCriteriaUsers: props?.customGetIndividualCriteriaUsers,
      customKeyIndividualCriteriaUsers: props?.customKeyIndividualCriteriaUsers,
      excludeDeactivatedUsersFromCollaboratorQueries,
    });

  const menuCriteria = [
    {
      title: t('see_reached'),
      Icon: IconEye,
      onClick: () => showCollabsInSegmentations(),
      disabled: creatingTemplate,
    },
    ...insertIf(criteria.type !== CriteriaType.ALL_USERS, {
      title: t('general:edit'),
      Icon: IconPencil,
      onClick: () => showCriteriaSelection({}),
      disabled: creatingTemplate,
    }),
    {
      title: t('general:delete'),
      Icon: IconTrash,
      onClick: () => showDeleteCriteriaModal(),
      disabled: creatingTemplate,
    },
  ];

  return (
    <Stack>
      <HuGoThemeProvider>
        {criteriaSelectionDrawer}
        {deleteCriteriaModal}
        {collabsInSegmentations}
        <HuMenuList options={menuCriteria} />
      </HuGoThemeProvider>
    </Stack>
  );
};

export default CriteriaMenu;
