import { readFile } from "node:fs/promises";
import { NextResponse } from "next/server";
import {
  UPLOAD_BUCKETS,
  isSafeUploadName,
  mimeForExt,
  uploadCandidatePaths,
  type UploadBucket,
} from "@/lib/upload";

/**
 * Liefert hochgeladene Bilder (Profil- & Kanalbilder) zur Laufzeit aus.
 *
 * Hintergrund: Dateien, die nach dem Serverstart in `public/` landen, werden
 * von Next.js nicht mehr statisch ausgeliefert. Diese Route liest die Datei
 * bei jeder Anfrage direkt von der Platte — der Upload ist damit sofort
 * sichtbar, ohne Neustart und ohne Browserwechsel.
 */
export async function GET(
  _req: Request,
  { params }: { params: Promise<{ path: string[] }> },
) {
  const { path: segments } = await params;
  if (segments.length !== 2) {
    return NextResponse.json({ error: "Not found" }, { status: 404 });
  }

  const [bucket, name] = segments;
  if (!UPLOAD_BUCKETS.includes(bucket as UploadBucket) || !isSafeUploadName(name)) {
    return NextResponse.json({ error: "Not found" }, { status: 404 });
  }

  for (const candidate of uploadCandidatePaths(bucket, name)) {
    try {
      const data = await readFile(candidate);
      return new Response(new Uint8Array(data), {
        headers: {
          "Content-Type": mimeForExt(name),
          // Dateinamen enthalten eine Zufallskomponente und ändern sich bei
          // jedem neuen Upload — daher dauerhaft cachebar.
          "Cache-Control": "private, max-age=31536000, immutable",
        },
      });
    } catch {
      /* nächster Kandidat */
    }
  }

  return NextResponse.json({ error: "Not found" }, { status: 404 });
}
