import { useEffect } from 'react';
import { useForm } from 'react-hook-form';

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

import useFormatDate from 'src/hooks/useFormatDate';
import {
  type BlockedDate,
  type Policy,
  type PolicyForm,
} from 'src/types/vacations';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { getInitialFormValues } from '../constants';
import { formatPolicyValues } from '../utils';

type Props = {
  policy: Policy | undefined;
  blockedDates: BlockedDate[] | undefined;
};

export const usePolicyForm = ({ policy, blockedDates }: Props) => {
  const { t } = useLokaliseTranslation(['time_off', 'general']);
  const { enqueueSnackbar } = useHuSnackbar();
  const { formatDate } = useFormatDate();

  const form = useForm<PolicyForm>({
    mode: 'onChange',
    defaultValues: getInitialFormValues(t),
  });

  useEffect(() => {
    if (!policy) return;

    const initializeForm = async () => {
      const formattedValues = await formatPolicyValues(
        policy,
        t,
        enqueueSnackbar,
      );

      const parsedBlockedDates =
        blockedDates?.map(date => ({
          ...date,
          fromDate: formatDate(date.fromDate, 'dd/MM/yyyy'),
          toDate: formatDate(date.toDate, 'dd/MM/yyyy'),
        })) || [];

      form.reset({
        ...formattedValues,
        blockedDates: parsedBlockedDates,
        hasDateRestrictions: parsedBlockedDates.length > 0,
      });
    };

    initializeForm();
  }, [policy, blockedDates]);

  return form;
};
