import { NextRequest, NextResponse } from "next/server";

const resolveBackendBaseUrl = () => {
  const value = process.env.NEXT_PUBLIC_API_BASE_URL?.trim() || "";
  return value.replace(/\/$/, "");
};

const getInternalKey = () => process.env.DB_EDITOR_INTERNAL_KEY || "sdm-db-editor-local-key";

const proxyRequest = async (
  request: NextRequest,
  context: { params: Promise<{ path: string[] }> }
) => {
  const token = request.cookies.get("token")?.value;

  if (!token) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const backendBaseUrl = resolveBackendBaseUrl();
  if (!backendBaseUrl) {
    return NextResponse.json({ error: "Backend URL is not configured" }, { status: 500 });
  }

  const { path } = await context.params;
  const url = `${backendBaseUrl}/api/db-editor/${path.join("/")}${request.nextUrl.search}`;

  const headers = new Headers();
  headers.set("Authorization", `Bearer ${token}`);
  headers.set("x-db-editor-internal", getInternalKey());

  const contentType = request.headers.get("content-type");
  if (contentType) {
    headers.set("content-type", contentType);
  }

  const bodyText = request.method === "GET" || request.method === "HEAD" ? undefined : await request.text();

  const upstream = await fetch(url, {
    method: request.method,
    headers,
    body: bodyText && bodyText.length > 0 ? bodyText : undefined,
    cache: "no-store",
  });

  const responseText = await upstream.text();
  const responseHeaders = new Headers();
  const responseContentType = upstream.headers.get("content-type");

  if (responseContentType) {
    responseHeaders.set("content-type", responseContentType);
  }

  return new NextResponse(responseText, {
    status: upstream.status,
    headers: responseHeaders,
  });
};

export const GET = proxyRequest;
export const POST = proxyRequest;
export const PATCH = proxyRequest;
export const DELETE = proxyRequest;
