import React, {useCallback, useEffect, useState} from 'react';
import {useNavigation} from '@react-navigation/native';
import {CloseButton} from '@components';
import {useBackHandler} from '@hooks/useBackHandler';
import {useGoBack} from '@hooks/useGoBack';
import {PDFFormParams, PdfFormAttributes} from '@modules/form/interfaces';
import {getForm, getFormAnswer} from '@modules/form/services';
import {ERROR} from '@shared/strings';
import {logAmplitudeEvent} from '@shared/utils';
import {AMPLITUDE_EVENTS} from '@shared/constants';

import PdfFormDownloadButton from './components/PdfFormDownloadButton';
import {
  cacheFirstPdfStepSource,
  clearPdfFormCacheDirectory,
  formatAnswerSteps,
} from './utils';

const PDF_FORM_STEP = 0;

export const usePdfFetch = ({formTemplateId, formId}: PDFFormParams) => {
  const navigation = useNavigation();
  const {goBack} = useGoBack();
  const [formConfig, setForm] = useState<Nullable<PdfFormAttributes>>(null);
  const [isFormFilled, setIsFormFilled] = useState(false);
  const [initialLoading, setInitialLoading] = useState(true);
  // TODO V2: Handle more steps
  const currentStepData = formConfig?.steps[PDF_FORM_STEP];

  const onGoBack = useCallback(() => {
    goBack();
    return true;
  }, [goBack]);

  useBackHandler(onGoBack);

  useEffect(() => {
    navigation.setOptions({
      headerLeft: () => <CloseButton onPress={goBack} />,
      title: formConfig?.title,
    });
  }, [navigation, formConfig, goBack]);

  useEffect(() => {
    isFormFilled &&
      currentStepData &&
      navigation.setOptions({
        headerRight: () => (
          <PdfFormDownloadButton
            formId={formConfig.id}
            title={formConfig.title}
            needApproval={formConfig.needApproval}
            stepData={currentStepData}
          />
        ),
      });
  }, [navigation, isFormFilled, currentStepData, formConfig]);

  useEffect(() => {
    const fetchFormTemplate = async () => {
      const filledForm = formId
        ? ((await getFormAnswer(formTemplateId, formId)) as
            | PdfFormAttributes
            | 'error')
        : undefined;

      if (filledForm && filledForm !== ERROR) {
        setIsFormFilled(true);
        const normalizedFilledForm = {
          ...filledForm,
          steps: formatAnswerSteps(filledForm),
        };
        const cachedFilledForm = await cacheFirstPdfStepSource(
          normalizedFilledForm,
        );
        setForm(cachedFilledForm);
      } else {
        const formTemplate = (await getForm(formTemplateId)) as
          | PdfFormAttributes
          | 'error';

        if (formTemplate === ERROR) {
          goBack();
        } else {
          !(filledForm && filledForm !== ERROR) &&
            logAmplitudeEvent(AMPLITUDE_EVENTS.FORM_START, {
              formId: formTemplateId,
              formPdf: true,
            });
          const cachedFormTemplate = await cacheFirstPdfStepSource(
            formTemplate,
          );
          setForm(cachedFormTemplate);
        }
      }

      setInitialLoading(false);
    };
    setForm(null);
    setInitialLoading(true);
    clearPdfFormCacheDirectory();
    fetchFormTemplate();
  }, [
    formId,
    formTemplateId,
    goBack,
    setForm,
    setInitialLoading,
    setIsFormFilled,
  ]);
  return {formConfig, isFormFilled, initialLoading, currentStepData};
};
