import { NextResponse } from "next/server";
import { promises as fs } from "node:fs";
import path from "node:path";
import { eq } from "drizzle-orm";
import { db, schema } from "@/lib/db";
import { requireAdmin } from "@/lib/guards";

const UPLOADS_DIR =
  process.env.UPLOADS_DIR || path.join(process.cwd(), "uploads");

/**
 * Télécharge un document d'un dossier. Admin uniquement.
 *
 * On lit le path depuis la DB (jamais depuis l'URL) pour empêcher
 * tout path traversal. Le fichier est servi en attachment forcé pour
 * éviter qu'un PDF malicieux exécute du JS dans le browser admin.
 */
export async function GET(
  _req: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  await requireAdmin();
  const { id } = await params;

  const doc = (
    await db
      .select()
      .from(schema.document)
      .where(eq(schema.document.id, id))
      .limit(1)
  )[0];

  if (!doc || !doc.filePath || !doc.fileName) {
    return NextResponse.json({ error: "Document introuvable" }, { status: 404 });
  }

  // Sécurité : on n'autorise pas de path traversal
  if (doc.filePath.includes("..")) {
    return NextResponse.json({ error: "Path invalide" }, { status: 400 });
  }

  const abs = path.join(UPLOADS_DIR, doc.filePath);
  try {
    const bytes = await fs.readFile(abs);
    const arrayBuffer = bytes.buffer.slice(
      bytes.byteOffset,
      bytes.byteOffset + bytes.byteLength
    );
    return new NextResponse(arrayBuffer as ArrayBuffer, {
      status: 200,
      headers: {
        "Content-Type": doc.mimeType ?? "application/octet-stream",
        "Content-Length": String(bytes.byteLength),
        // attachment forcé : pas d'inline qui pourrait exécuter du JS dans
        // un PDF / SVG malicieux. Filename encodé en UTF-8 RFC 5987.
        "Content-Disposition": `attachment; filename*=UTF-8''${encodeURIComponent(
          doc.fileName
        )}`,
        "Cache-Control": "private, no-store",
      },
    });
  } catch {
    return NextResponse.json({ error: "Fichier introuvable sur disque" }, { status: 404 });
  }
}
