import { useNavigate } from 'react-router-dom';

import {
  IconDotsVertical,
  IconDownload,
  IconEye,
  IconFolderPlus,
  IconFolderShare,
  IconPencil,
  IconTrash,
  IconUsers,
} from '@material-hu/icons/tabler';
import IconButton from '@material-hu/mui/IconButton';

import useHuSnackbar from '@material-hu/components/design-system/Snackbar';
import { useDialogLayer } from '@material-hu/components/layers/Dialogs';
import { useDrawerLayer } from '@material-hu/components/layers/Drawers';
import { useMenuLayer } from '@material-hu/components/layers/Menus';

import { type AudienceCriteria, LogicalOperator } from 'src/types/audience';
import { insertIf } from 'src/utils/arrayUtils';
import { downloadFile } from 'src/utils/filesUtils';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { agentsRoutes } from '../../../routes';
import { type KnowledgeBaseItem, KnowledgeBaseItemType } from '../../types';
import DeleteConfirmDialog from '../DeleteConfirmDialog';
import EditAudienceDrawer from '../EditAudienceDrawer';
import EditNameDialog from '../EditNameDialog';
import KnowledgeBaseAudienceCollaboratorsDrawer from '../KnowledgeBaseAudienceCollaboratorsDrawer';
import MoveItemDrawer from '../MoveItemDrawer';
import NewFolderDialog from '../NewFolderDialog';

type KnowledgeBaseRowMenuProps = {
  item: KnowledgeBaseItem;
};

const DELETE_FILE_DIALOG_ID = 'knowledge-base-delete-file-dialog';
const DELETE_FOLDER_DIALOG_ID = 'knowledge-base-delete-folder-dialog';
const CREATE_SUBFOLDER_DIALOG_ID = 'knowledge-base-create-subfolder-dialog';
const EDIT_NAME_DIALOG_ID = 'knowledge-base-edit-name-dialog';

const KnowledgeBaseRowMenu = ({ item }: KnowledgeBaseRowMenuProps) => {
  const { t } = useLokaliseTranslation(['agents', 'files']);
  const navigate = useNavigate();
  const { openMenu } = useMenuLayer();
  const { openDrawer } = useDrawerLayer();
  const { openDialog, closeDialog } = useDialogLayer();
  const { enqueueSnackbar } = useHuSnackbar();

  const handleDeleteFile = () => {
    openDialog(
      {
        content: (
          <DeleteConfirmDialog
            variant="file"
            name={item.name}
            filename={item.path}
            onClose={() => closeDialog(DELETE_FILE_DIALOG_ID)}
          />
        ),
      },
      DELETE_FILE_DIALOG_ID,
    );
  };

  const handleDeleteFolder = () => {
    openDialog(
      {
        content: (
          <DeleteConfirmDialog
            variant="folder"
            fileCount={item.itemCount ?? 0}
            path={item.path}
            onClose={() => closeDialog(DELETE_FOLDER_DIALOG_ID)}
          />
        ),
      },
      DELETE_FOLDER_DIALOG_ID,
    );
  };

  const handleEditAudience = () => {
    openDrawer({
      content: (
        <EditAudienceDrawer
          items={[item.path]}
          defaultAudience={item.segmentationTags}
        />
      ),
    });
  };

  const handleShowAudience = () => {
    const isAllUsers = item.segmentationTags.length === 0;
    const criteria: AudienceCriteria[] = [
      {
        includeAllUsers: isAllUsers,
        specificUserIds: [],
        segmentationExpression: isAllUsers
          ? null
          : {
              operator: LogicalOperator.OR,
              expressions: item.segmentationTags.map(tag => ({
                groupId: tag.groupId,
                itemIds: [tag.itemId],
              })),
            },
      },
    ];

    openDrawer({
      content: <KnowledgeBaseAudienceCollaboratorsDrawer criteria={criteria} />,
    });
  };

  const handleRename = () => {
    openDialog(
      {
        content: (
          <EditNameDialog
            item={item}
            onClose={() => closeDialog(EDIT_NAME_DIALOG_ID)}
          />
        ),
      },
      EDIT_NAME_DIALOG_ID,
    );
  };

  const handleMove = () => {
    openDrawer({
      content: <MoveItemDrawer item={item} />,
    });
  };

  const handleCreateSubfolder = () => {
    const parentPath = item.path;

    openDialog(
      {
        content: (
          <NewFolderDialog
            parentPath={parentPath}
            onClose={() => closeDialog(CREATE_SUBFOLDER_DIALOG_ID)}
            onSuccess={() => {
              navigate(
                agentsRoutes.knowledgeBase.folder(
                  encodeURIComponent(parentPath),
                ),
              );
            }}
          />
        ),
      },
      CREATE_SUBFOLDER_DIALOG_ID,
    );
  };

  const isFile = item.type === KnowledgeBaseItemType.FILE;

  const handleDownload = () => {
    downloadFile(item.downloadUrl, item.name).then(() => {
      enqueueSnackbar({
        title: t('files:file_downloaded'),
        variant: 'success',
      });
    });
  };

  const menuItems = [
    ...insertIf(isFile, {
      id: 'show_audience',
      icon: IconEye,
      title: t('knowledge_base.see_reached'),
      onSelect: handleShowAudience,
    }),
    ...insertIf(isFile, {
      id: 'download',
      icon: IconDownload,
      title: t('general:download'),
      onSelect: handleDownload,
    }),
    {
      id: 'rename',
      icon: IconPencil,
      title: t('knowledge_base.row_menu.rename'),
      onSelect: handleRename,
    },
    ...insertIf(isFile, {
      id: 'edit_audience',
      icon: IconUsers,
      title: t('knowledge_base.row_menu.edit_audience'),
      onSelect: handleEditAudience,
    }),
    ...insertIf(!isFile, {
      id: 'create_subfolder',
      icon: IconFolderPlus,
      title: t('knowledge_base.row_menu.create_subfolder'),
      onSelect: handleCreateSubfolder,
    }),
    {
      id: 'move',
      icon: IconFolderShare,
      title: t('knowledge_base.row_menu.move'),
      onSelect: handleMove,
    },
    {
      id: 'delete',
      icon: IconTrash,
      title: t('general:delete'),
      onSelect: isFile ? handleDeleteFile : handleDeleteFolder,
    },
  ];

  const handleOpenMenu = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.stopPropagation();
    openMenu({
      anchorEl: e.currentTarget,
      items: menuItems,
      menuProps: {
        position: 'left',
        fixedDimensions: false,
        sx: { minWidth: '300px' },
      },
    });
  };

  return (
    <IconButton
      onClick={handleOpenMenu}
      aria-label={t('general:actions')}
    >
      <IconDotsVertical />
    </IconButton>
  );
};

export default KnowledgeBaseRowMenu;
