import { FormikConfig, FormikValues, useFormik } from "formik";
import { z, ZodSchema } from "zod";

// Определяем тип для конфигурации нашего хука,
// расширяя FormikConfig и добавляя validationSchema
interface UseFormikWithZodConfig<Values>
	extends Omit<FormikConfig<Values>, "validate" | "validationSchema"> {
	validationSchema?: ZodSchema<Values>;
}

export function useFormikWithZod<Values extends FormikValues>(
	config: UseFormikWithZodConfig<Values>
) {
	const { validationSchema, ...formikConfig } = config;

	const formik = useFormik<Values>({
		...formikConfig,
		validate: (values) => {
			try {
				validationSchema?.parse(values);
				return {}; // Нет ошибок, если Zod не выбросил исключение
			} catch (error) {
				const zodError = error as z.ZodError;
				const errors: Record<string, string> = {};
				zodError.issues.forEach((issue) => {
					const fieldName = issue.path.join("."); // Объединяем путь к полю (например, hobbies.0)
					errors[fieldName] = issue.message;
				});
				return errors;
			}
		},
	});

	return formik;
}
