"use client";

import { useState } from "react";
import { Button } from "@/components/ui/button";
import { problemMessage } from "@/lib/problem";

// Téléchargement du CSV des lignes en erreur d'un import.
//
// Pourquoi pas un simple `<a download>` : l'attribut `download` force le navigateur à
// **enregistrer** la réponse même-origine quoi qu'elle contienne. Un import consulté à J+31
// (fichiers purgés à 30 jours, décision n°7) répond 410 ; l'utilisateur récupérait alors un
// fichier contenant `{"title":"Gone","detail":"…"}` et ne lisait jamais le message. Un
// redirect ne réglerait rien — `download` suit les redirections et enregistre la cible.
//
// Donc : on demande la ressource, on **regarde le statut**, et on n'ouvre le téléchargement
// que sur une vraie réponse CSV. Le corps est chargé en mémoire, ce qui est borné : le
// pipeline plafonne `errors.csv` à 50 000 lignes (`ERRORS_CSV_LIMIT`).

export function ErrorsCsvLink({
  importId,
  truncated = false,
}: {
  importId: string;
  /** Le rapport annonce une collecte tronquée (`errors_complete: false`). */
  truncated?: boolean;
}) {
  const [busy, setBusy] = useState(false);
  const [error, setError] = useState<string | null>(null);

  const download = async () => {
    setBusy(true);
    setError(null);
    let url: string | null = null;
    try {
      const res = await fetch(`/api/imports/${importId}/errors`);
      if (!res.ok) {
        setError(problemMessage(res.status, await res.text()));
        return;
      }
      const blob = await res.blob();
      url = URL.createObjectURL(blob);
      const anchor = document.createElement("a");
      anchor.href = url;
      anchor.download = `import-${importId}-errors.csv`;
      // Safari/Firefox exigent l'ancre dans le DOM, et une révocation synchrone
      // après click() peut annuler le téléchargement d'un gros fichier.
      document.body.appendChild(anchor);
      anchor.click();
      anchor.remove();
      const staleUrl = url;
      url = null;
      setTimeout(() => URL.revokeObjectURL(staleUrl), 10_000);
    } catch {
      setError("Téléchargement impossible : le serveur n'a pas répondu.");
    } finally {
      if (url !== null) URL.revokeObjectURL(url);
      setBusy(false);
    }
  };

  return (
    <div className="space-y-2 text-sm">
      <p>
        <Button
          type="button"
          variant="outline"
          size="sm"
          disabled={busy}
          onClick={() => void download()}
        >
          {busy ? "Préparation…" : "Télécharger les lignes en erreur (CSV)"}
        </Button>
        {truncated ? (
          <span className="text-muted-foreground ml-2">
            Liste tronquée : le fichier a dépassé le plafond de collecte.
          </span>
        ) : null}
      </p>
      {error ? (
        <p role="alert" className="text-destructive">
          {error}
        </p>
      ) : null}
    </div>
  );
}
