import { useFormContext, useWatch } from 'react-hook-form';
import { useMutation, useQueryClient } from 'react-query';

import useHuSnackbar from '@material-hu/components/design-system/Snackbar';

import useSegmentationGroups from 'src/hooks/queryHooks/useSegmentationGroups';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { knowledgeBaseKeys } from '../../queries';
import { KnowledgeBaseAudienceType } from '../../types';
import { buildSegmentationTags } from '../../utils';
import { UPLOAD_FIELDS } from '../constants';
import { uploadKnowledgeBaseFile } from '../services';
import { type UploadFormValues } from '../types';

type Args = {
  filename: string;
  payload: FormData;
};

export const useUploadKnowledgeBaseFile = () => {
  const { t } = useLokaliseTranslation('agents');
  const { enqueueSnackbar } = useHuSnackbar();
  const queryClient = useQueryClient();
  const segmentationsQuery = useSegmentationGroups({ select: r => r.data });

  const form = useFormContext<UploadFormValues>();
  const [files, folderPath, audienceType, segmentation] = useWatch({
    control: form.control,
    name: [
      UPLOAD_FIELDS.files,
      UPLOAD_FIELDS.folderPath,
      UPLOAD_FIELDS.audienceType,
      UPLOAD_FIELDS.segmentation,
    ],
  });

  const { mutate, isLoading } = useMutation({
    mutationFn: ({ filename, payload }: Args) =>
      uploadKnowledgeBaseFile(filename, payload),
    onSuccess: () => {
      const name = files[0]?.file?.name;
      enqueueSnackbar({
        title: t('upload.success', { name }),
        variant: 'success',
      });
      queryClient.invalidateQueries(knowledgeBaseKeys.all);
    },
    onError: () => {
      enqueueSnackbar({
        title: t('upload.error'),
        variant: 'error',
      });
    },
  });

  const uploadFile = ({ onSuccess }: { onSuccess?: () => void }) => {
    const file = files[0]?.file;
    if (!file) return;

    const filename = folderPath ? `${folderPath}${file.name}` : file.name;

    const formData = new FormData();

    const isSegmented = audienceType === KnowledgeBaseAudienceType.SEGMENTED;
    const tags = isSegmented
      ? buildSegmentationTags(segmentation, segmentationsQuery.data ?? [])
      : [];
    formData.append('segmentation', JSON.stringify({ tags, userIds: [] }));

    formData.append('file', file);

    return mutate({ filename, payload: formData }, { onSuccess });
  };

  return { uploadFile, isLoading };
};
