import { NextRequest } from "next/server";

const BACKEND_ORIGIN =
  process.env.API_ORIGIN_INTERNAL ||
  process.env.NEXT_PUBLIC_API_ORIGIN ||
  "http://127.0.0.1:8000";

/**
 * GET /api/images/[...path]
 * Proxy seguro para servir imágenes desde el backend.
 *
 * - NO forwardea cookies/credenciales
 * - Valida path para evitar traversal / paths raros
 * - Cache fuerte para performance
 */
export async function GET(
  request: NextRequest,
  context: { params: Promise<{ path: string[] }> }
): Promise<Response> {
  // En Next 16, params puede venir como Promise -> hay que await.
  const { path } = await context.params;

  // Normaliza a un path seguro: "a/b/c"
  const p = Array.isArray(path) ? path.join("/") : "";

  // Validación estricta:
  // - no vacío
  // - sin ".." ni backslashes
  // - solo caracteres seguros para rutas de archivos web (ajustable)
  // - bloquea traversal incluso si viene URL-encoded
  const decoded = safeDecodeURIComponent(p);

  if (!decoded) {
    return new Response("Bad request", { status: 400 });
  }
  if (decoded.includes("..") || decoded.includes("\\") || decoded.includes("\0")) {
    return new Response("Bad request", { status: 400 });
  }
  if (!/^[a-zA-Z0-9/_\-.]+$/.test(decoded)) {
    return new Response("Bad request", { status: 400 });
  }
  // Evita paths absolutos o dobles slashes
  if (decoded.startsWith("/") || decoded.includes("//")) {
    return new Response("Bad request", { status: 400 });
  }

  const url = `${BACKEND_ORIGIN}/api/images/${decoded}`;

  const upstream = await fetch(url, {
    // Imágenes públicas: no forward cookies/credentials
    headers: {
      "user-agent": request.headers.get("user-agent") ?? "",
      accept: request.headers.get("accept") ?? "image/*",
      // opcional: si tu backend soporta range requests para imágenes grandes
      // range: request.headers.get("range") ?? "",
    },
    // Importante: para imágenes estáticas, cache fuerte.
    // Si tus imágenes cambian con el mismo path, bajá max-age o sacá immutable.
    cache: "force-cache",
  });

  if (!upstream.ok || !upstream.body) {
    // respeta status si viene (404/403/etc.)
    return new Response("Not found", { status: upstream.status || 404 });
  }

  // Copiamos headers relevantes del upstream
  const contentType = upstream.headers.get("content-type") ?? "image/*";
  const etag = upstream.headers.get("etag");
  const lastModified = upstream.headers.get("last-modified");

  const headers = new Headers();
  headers.set("content-type", contentType);

  // Cache fuerte para performance CDN/browser
  headers.set("cache-control", "public, max-age=31536000, immutable");

  // Preserva validadores si existen
  if (etag) headers.set("etag", etag);
  if (lastModified) headers.set("last-modified", lastModified);

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

function safeDecodeURIComponent(value: string): string {
  try {
    return decodeURIComponent(value);
  } catch {
    // Si el decode falla, tratamos el input como inválido
    return "";
  }
}
