import { NextRequest } from "next/server";

const KOL_LIST_ORIGIN = "https://static-content-4ap.pages.dev";

const HOP_BY_HOP = new Set([
  "connection",
  "keep-alive",
  "proxy-authenticate",
  "proxy-authorization",
  "te",
  "trailers",
  "transfer-encoding",
  "upgrade",
  "content-encoding",
  "content-length",
]);

function responseHeaders(from: Headers) {
  const headers = new Headers();
  from.forEach((value, key) => {
    if (!HOP_BY_HOP.has(key.toLowerCase())) {
      headers.append(key, value);
    }
  });
  return headers;
}

async function proxyKolList(request: NextRequest) {
  const incoming = new URL(request.url);
  let dest = `${KOL_LIST_ORIGIN}${incoming.pathname}${incoming.search}`;

  for (let i = 0; i < 4; i++) {
    const upstream = await fetch(dest, {
      method: request.method,
      headers: {
        accept: request.headers.get("accept") ?? "*/*",
        "user-agent": request.headers.get("user-agent") ?? "connector-club-kol-list",
      },
      redirect: "manual",
    });

    if (upstream.status >= 300 && upstream.status < 400) {
      const location = upstream.headers.get("location");
      if (!location) {
        return new Response(null, {
          status: upstream.status,
          headers: responseHeaders(upstream.headers),
        });
      }

      const next = new URL(location, dest);
      if (next.origin !== KOL_LIST_ORIGIN) {
        return new Response(null, {
          status: upstream.status,
          headers: { location: next.href },
        });
      }

      dest = next.href;
      continue;
    }

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

  return new Response("Bad gateway", { status: 502 });
}

export function GET(request: NextRequest) {
  return proxyKolList(request);
}

export function HEAD(request: NextRequest) {
  return proxyKolList(request);
}
