import { NextRequest, NextResponse } from "next/server";
import { connectDB } from "@/lib/db";
import { ClientPhotoFolder } from "@/models/ClientPhotoFolder";
import { Order } from "@/models/Order";
import { PhotoRating } from "@/models/PhotoRating";
import { fetchPreviewSafe, fetchOriginal } from "@/lib/nextcloud";
import { applyWatermark } from "@/lib/watermark";

// Öffentliche Variante von api/photos/[folderId]/[filename] — kein Login
// nötig, dafür über den Teilen-Token statt der Ordner-ID/Session autorisiert
// (siehe toggleFolderShareAction). Bewusst kein "download=1"-Support wie bei
// der Konto-Route — ein geteilter Link soll zum Ansehen da sein, nicht zum
// pauschalen Herunterladen der Originale durch Dritte ohne eigenes Konto.
export async function GET(
  req: NextRequest,
  { params }: { params: Promise<{ token: string; filename: string }> }
) {
  const { token, filename } = await params;
  if (!token) return new NextResponse("Not found", { status: 404 });
  // filename kommt direkt aus der URL — ohne diese Prüfung könnte ein
  // eingeschleustes "../" (z. B. per %2F-Segment) Dateien außerhalb des
  // freigegebenen Ordners auf demselben Nextcloud-Share erreichen.
  if (filename.includes("/") || filename.includes("\\") || filename.includes("..")) {
    return new NextResponse("Not found", { status: 404 });
  }

  await connectDB();
  const folder = await ClientPhotoFolder.findOne({
    shareToken: token,
    $or: [{ shareTokenExpiresAt: null }, { shareTokenExpiresAt: { $gte: new Date() } }],
  }).lean();
  if (!folder) return new NextResponse("Not found", { status: 404 });

  // Ein Teilen-Link darf nie mehr zeigen als der Kunde selbst im Konto sieht
  // — auch direkte Bild-Anfragen über die API prüfen die Freigabe, nicht nur
  // die Seite selbst (Verteidigung in der Tiefe, siehe api/photos/[folderId]).
  const rating = await PhotoRating.findOne({ folderId: folder._id, fileName: filename }).select("approvedForDownload").lean();
  if (!rating?.approvedForDownload) return new NextResponse("Not found", { status: 404 });

  // Wie bei der Konto-Route: unbezahlte Aufträge bleiben auch über den
  // Teilen-Link wasserzeichenbehaftet — ein geteilter Link darf den Schutz
  // vor Zahlungseingang nicht umgehen.
  let needsWatermark = false;
  if (folder.orderId) {
    const order = await Order.findById(folder.orderId).select("paid").lean();
    needsWatermark = Boolean(order && !order.paid);
  }

  const variant = req.nextUrl.searchParams.get("variant") === "full" ? "full" : "thumb";
  const filePath = `${folder.nextcloudPath}/${filename}`;

  try {
    if (variant === "thumb") {
      let buffer = await fetchPreviewSafe(filePath, 480);
      if (needsWatermark) buffer = await applyWatermark(buffer);
      return new NextResponse(new Uint8Array(buffer), {
        headers: { "Content-Type": "image/jpeg", "Cache-Control": "private, max-age=3600" },
      });
    }

    let buffer = await fetchOriginal(filePath);
    let mime: string;
    if (needsWatermark) {
      buffer = await applyWatermark(buffer);
      mime = "image/jpeg";
    } else {
      const ext = filename.split(".").pop()?.toLowerCase();
      mime = ext === "png" ? "image/png" : ext === "webp" ? "image/webp" : "image/jpeg";
    }
    return new NextResponse(new Uint8Array(buffer), {
      headers: { "Content-Type": mime, "Cache-Control": "private, max-age=0, no-store" },
    });
  } catch {
    return new NextResponse("Not found", { status: 404 });
  }
}
