import { NextResponse } from "next/server";
import { getSession } from "@/lib/auth/session";
import { env } from "@/lib/config";
import { logActivity } from "@/lib/db/audit";

// Téléchargement RELAYÉ du ZIP d'export RGPD d'un tenant, côté sysop (mf #151).
//
// Le backend a choisi un stream proxifié (pas d'URL signée) : l'accès est gardé
// par SuperAdminGuard, et le panel ne touche JAMAIS le `download_token_hash`.
// Ce handler appelle l'endpoint sysop avec le Bearer super-admin et pipe la
// réponse binaire au navigateur. apiFetch() ne convient pas (il lit/parse le
// corps en texte) — on fait donc un fetch direct ici pour préserver le stream.
//
//   GET /api/sysop/rgpd_export_download.php?tenant_id=X&job_id=Y  (Bearer)
//     200 application/zip · 404 EXPORT_NOT_FOUND / EXPORT_FILE_MISSING
//     410 EXPORT_EXPIRED · 422 INVALID_PARAMS · 401/403 auth

export async function GET(
  req: Request,
  { params }: { params: Promise<{ id: string }> },
) {
  const session = await getSession();
  if (!session?.user.is_superadmin) {
    return NextResponse.json(
      { success: false, error: "FORBIDDEN" },
      { status: 403 },
    );
  }

  const { id: idStr } = await params;
  const id = Number.parseInt(idStr, 10);
  if (!Number.isFinite(id) || id <= 0) {
    return NextResponse.json(
      { success: false, error: "INVALID_ID" },
      { status: 400 },
    );
  }

  const jobId = Number.parseInt(
    new URL(req.url).searchParams.get("job_id") ?? "",
    10,
  );
  if (!Number.isFinite(jobId) || jobId <= 0) {
    return NextResponse.json(
      { success: false, error: "INVALID_JOB_ID" },
      { status: 400 },
    );
  }

  // Audit avant l'appel : l'extraction d'un export RGPD est sensible, on trace
  // l'intention même si le backend refuse ensuite (expiré / fichier purgé).
  void logActivity({
    type: "superadmin.tenant_rgpd_export_download",
    title: `Téléchargement export RGPD — tenant #${id}`,
    description: `job_id=${jobId}`,
    tenant_id: id,
    user_id: session.user.id,
  });

  const url = new URL(`${env.apiBaseUrl}/sysop/rgpd_export_download.php`);
  url.searchParams.set("tenant_id", String(id));
  url.searchParams.set("job_id", String(jobId));

  let upstream: Response;
  try {
    upstream = await fetch(url, {
      headers: { Authorization: `Bearer ${session.token}` },
      cache: "no-store",
    });
  } catch {
    return NextResponse.json(
      { success: false, error: "BACKEND_UNAVAILABLE" },
      { status: 502 },
    );
  }

  // Erreur backend : corps JSON (EXPORT_NOT_FOUND, EXPORT_EXPIRED, …). On le
  // relaie tel quel pour que l'UI affiche un message précis.
  if (!upstream.ok) {
    const text = await upstream.text();
    let payload: unknown;
    try {
      payload = text ? JSON.parse(text) : { success: false };
    } catch {
      payload = { success: false, error: "UPSTREAM_ERROR" };
    }
    return NextResponse.json(payload, { status: upstream.status });
  }

  // Succès : on pipe le flux ZIP au navigateur. On réutilise les en-têtes utiles
  // de l'upstream (type, taille, nom de fichier), avec un fallback raisonnable.
  const headers = new Headers();
  headers.set(
    "Content-Type",
    upstream.headers.get("content-type") ?? "application/zip",
  );
  headers.set(
    "Content-Disposition",
    upstream.headers.get("content-disposition") ??
      `attachment; filename="export-rgpd-tenant-${id}-job-${jobId}.zip"`,
  );
  const len = upstream.headers.get("content-length");
  if (len) headers.set("Content-Length", len);
  headers.set("Cache-Control", "no-store");

  return new NextResponse(upstream.body, { status: 200, headers });
}
