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

const UPSTREAM =
  process.env.COMMUNICATION_SERVICE_URL ||
  process.env.NEXT_PUBLIC_COMMUNICATION_API_URL ||
  "http://localhost:8005";

async function proxy(req: NextRequest, pathSegments: string[]) {
  const p = pathSegments.join("/");
  const url = new URL(req.url);
  const target = `${UPSTREAM.replace(/\/$/, "")}/${p}${url.search}`;
  const headers = new Headers();
  for (const h of ["authorization", "content-type", "x-tenant-id", "accept"]) {
    const v = req.headers.get(h);
    if (v) headers.set(h, v);
  }
  let body: ArrayBuffer | undefined;
  if (req.method !== "GET" && req.method !== "HEAD") body = await req.arrayBuffer();
  try {
    const res = await fetch(target, { method: req.method, headers, body, cache: "no-store" });
    const out = new Headers();
    const ct = res.headers.get("content-type");
    if (ct) out.set("content-type", ct);
    return new NextResponse(await res.arrayBuffer(), { status: res.status, headers: out });
  } catch (err) {
    const detail = err instanceof Error ? err.message : "upstream_unreachable";
    return NextResponse.json(
      { error: { code: "communication_proxy_error", message: `پروکسی تربت ارتباط — ${detail}` } },
      { status: 502 }
    );
  }
}

export async function GET(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
  const { path: p } = await ctx.params;
  return proxy(req, p);
}
export async function POST(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
  const { path: p } = await ctx.params;
  return proxy(req, p);
}
export async function PATCH(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
  const { path: p } = await ctx.params;
  return proxy(req, p);
}
export async function PUT(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
  const { path: p } = await ctx.params;
  return proxy(req, p);
}
export async function DELETE(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
  const { path: p } = await ctx.params;
  return proxy(req, p);
}
