// src/hooks/use-serp-import.ts
"use client";

import { useCallback, useState } from "react";

// Exportée pour que les appelants puissent répliquer la garde de taille
// dans leur propre logique de clear d'état (ex: SerpPanel).
export const SERP_IMPORT_MAX_FILE_SIZE = 25_000_000;
const MAX_FILE_SIZE = SERP_IMPORT_MAX_FILE_SIZE;
const SIZE_ERROR =
  "Fichier trop lourd (max 25 Mo) — attendu : un export « SERP URLs ».";

export type UseSerpImportOptions = {
  onSuccess?: () => void;
  onError?: (message: string) => void;
  /** Message si `{ ok: false }` sans `error` du serveur. */
  genericErrorMessage?: string;
  /** Message si le fetch/parsing échoue (catch). */
  networkErrorMessage?: string;
};

export type UseSerpImportResult = {
  importFile: (file: File) => Promise<void>;
  busy: boolean;
};

// Upload d'un export SERP pour un mot-clé donné (route dédiée — contourne le
// cap 1 Mo des Server Actions). Ne gère aucun rendu/toast : les callbacks
// laissent chaque appelant décider du feedback (inline vs sonner) et de ce
// qu'il fait en cas de succès (ex: recharger ses données). Les messages de
// fallback (générique / réseau) sont paramétrables : les appelants existants
// avaient chacun leur propre libellé, préservé via les options.
export function useSerpImport(
  keywordId: string,
  {
    onSuccess,
    onError,
    genericErrorMessage = "Import échoué",
    networkErrorMessage = "Import impossible (fichier trop volumineux ou invalide).",
  }: UseSerpImportOptions = {},
): UseSerpImportResult {
  const [busy, setBusy] = useState(false);

  const importFile = useCallback(
    async (file: File) => {
      if (file.size > MAX_FILE_SIZE) {
        onError?.(SIZE_ERROR);
        return;
      }
      setBusy(true);
      try {
        const fd = new FormData();
        fd.set("keywordId", keywordId);
        fd.set("file", file);
        const res = await fetch("/keywords/serp/import", {
          method: "POST",
          body: fd,
        });
        const json = (await res.json()) as { ok: boolean; error?: string };
        if (!json.ok) {
          onError?.(json.error ?? genericErrorMessage);
        } else {
          onSuccess?.();
        }
      } catch {
        onError?.(networkErrorMessage);
      } finally {
        setBusy(false);
      }
    },
    [keywordId, onSuccess, onError, genericErrorMessage, networkErrorMessage],
  );

  return { importFile, busy };
}
