import { FormProvider, useForm } from 'react-hook-form';

import {
  type GetDrawerConfiguration,
  useDrawerV2,
} from '@material-hu/hooks/useDrawerV2';

import useAuth from 'src/contexts/JWTContext';
import {
  type SecurityActivityFilters,
  type SecurityActivityReportPayload,
} from 'src/types/insights';
import { useLokaliseTranslation } from 'src/utils/i18n';
import { LogEvents, logEvent } from 'src/utils/logging';

import ActivityReportDrawer from '../components/ActivityRecord/ActivityReportDrawer';
import ActivityReportDrawerFooter from '../components/ActivityRecord/ActivityReportDrawerFooter';
import { getActiveFilterTypes } from '../components/ActivityRecord/tracking';
import { filtersToReportPayload } from '../components/ActivityRecord/utils';

import useSendActivityReport from './useSendActivityReport';

type ActivityReportFormValues = {
  email: string;
};

type Props = {
  filters: SecurityActivityFilters;
  filtersCount: number;
  onUpdateFilters: () => void;
};

const useActivityReportDrawer: GetDrawerConfiguration<Props> = ({
  closeDrawer,
  filters,
  filtersCount,
  onUpdateFilters,
}) => {
  const { t } = useLokaliseTranslation(['settings', 'forms']);
  const { user } = useAuth();
  const { sendReport, isSending } = useSendActivityReport();

  const form = useForm<ActivityReportFormValues>({
    defaultValues: {
      email: user?.email || '',
    },
    reValidateMode: 'onChange',
  });

  const { handleSubmit, formState } = form;
  const { isValid, submitCount } = formState;

  const handleClose = () => {
    form.reset({ email: user?.email || '' });
    closeDrawer();
  };

  const handleSendReport = ({ email }: ActivityReportFormValues) => {
    const payload: SecurityActivityReportPayload = {
      email,
      ...filtersToReportPayload(filters),
    };
    sendReport(payload, {
      onSuccess: () => {
        const filterTypesApplied = getActiveFilterTypes(filters);
        logEvent(LogEvents.SECURITY_REPORT_DOWNLOADED, {
          hasActiveFilters: filterTypesApplied.length > 0,
          filterTypesApplied,
        });
        handleClose();
      },
    });
  };

  return {
    title: t('security.activity_record_tab.activity_report.drawer_title'),
    children: (
      <FormProvider {...form}>
        <ActivityReportDrawer />
      </FormProvider>
    ),
    footer: (
      <ActivityReportDrawerFooter
        filtersCount={filtersCount}
        onUpdateFilters={onUpdateFilters}
      />
    ),
    onClose: handleClose,
    primaryButtonProps: {
      children: t('general:send'),
      onClick: handleSubmit(handleSendReport),
      disabled: isSending || (submitCount > 0 && !isValid),
      loading: isSending,
      fullWidth: true,
    },
    secondaryButtonProps: {
      children: t('forms:cancel'),
      onClick: handleClose,
      fullWidth: true,
    },
  };
};

export default () => useDrawerV2(useActivityReportDrawer);
