'use client';

import { useEffect, useRef } from 'react';
import { useFormikContext } from 'formik';
import { toast } from 'sonner';

/**
 * Affiche un toast d'erreur en haut de l'écran lorsqu'une tentative de
 * soumission Formik échoue à la validation. On suit `submitCount` pour ne
 * réagir qu'aux nouvelles tentatives, et on remonte le premier message
 * d'erreur (les messages Yup sont déjà traduits dans les schémas).
 * À placer une fois à l'intérieur de chaque `<Form>`.
 */
export function FormikErrorToast() {
  const { submitCount, isValid, errors } = useFormikContext();
  const lastCount = useRef(submitCount);

  useEffect(() => {
    if (submitCount === lastCount.current) return;
    lastCount.current = submitCount;
    if (isValid) return;
    const message = firstError(errors);
    if (message) toast.error(message);
  }, [submitCount, isValid, errors]);

  return null;
}

/** Parcourt l'arbre d'erreurs Formik (objets/tableaux imbriqués) et renvoie le premier message. */
function firstError(value: unknown): string | undefined {
  if (typeof value === 'string') return value;
  if (Array.isArray(value)) {
    for (const item of value) {
      const found = firstError(item);
      if (found) return found;
    }
  } else if (value && typeof value === 'object') {
    for (const item of Object.values(value)) {
      const found = firstError(item);
      if (found) return found;
    }
  }
  return undefined;
}
