import {useForm} from 'react-hook-form';
import {ZodTypeAny, z} from 'zod';
import {zodResolver} from '@hookform/resolvers/zod';
import {
  FormValues,
  QuestionType,
  SurveyForm,
} from '@modules/peopleExperience/interfaces';

interface FormAccumulator {
  peopleExperienceFormSchema: Record<string, ZodTypeAny>;
}

interface Props {
  form?: SurveyForm;
  defaultValues?: FormValues;
  stepNumber: number;
}

const createFieldSchema = ({
  type,
  required,
}: {
  type: QuestionType;
  required: boolean;
}) => {
  let baseSchema: ZodTypeAny;
  const minLength = required ? 1 : 0;
  switch (type) {
    case QuestionType.TEXT:
      baseSchema = z.string().min(minLength);
      break;
    case QuestionType.CHECKBOX:
      baseSchema = z.number().array().min(minLength);
      break;
    case QuestionType.MULTIPLE_CHOICE:
    case QuestionType.RATING:
      baseSchema = required ? z.number() : z.any();
      break;
    default:
      baseSchema = z.any();
      break;
  }
  return required ? baseSchema : baseSchema.optional();
};

export const usePeopleExperienceForm = ({
  form,
  defaultValues,
  stepNumber,
}: Props) => {
  const formReducer = form?.questions.slice(0, stepNumber + 1).reduce(
    (acc: FormAccumulator, question) => {
      const {id, type, required} = question;
      const fieldSchema = createFieldSchema({
        type,
        required,
      });
      acc.peopleExperienceFormSchema[id] = fieldSchema;
      return acc;
    },
    {peopleExperienceFormSchema: {}},
  );

  const formMethods = useForm({
    resolver: zodResolver(
      z.object(formReducer ? formReducer.peopleExperienceFormSchema : {}),
    ),
    defaultValues,
  });

  return formMethods;
};
