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

import {
  generateBackendJwt,
  PARTNER_CODE,
  STATUS_ENDPOINT,
} from "@/lib/diagnostic-status-server";

export const runtime = "nodejs";

function response(message: string, status: number, data: object = {}) {
  return NextResponse.json(
    {
      status: status < 400 ? "success" : "error",
      code: status,
      message,
      data,
    },
    { status },
  );
}

async function parseUpstreamBody(upstreamResponse: Response) {
  const text = await upstreamResponse.text();

  if (!text) {
    return "";
  }

  try {
    return JSON.parse(text);
  } catch {
    return text;
  }
}

export async function POST(request: NextRequest) {
  let payload: unknown;

  try {
    payload = await request.json();
  } catch {
    return response("The request body must be valid JSON", 400);
  }

  if (!STATUS_ENDPOINT) {
    return response("Backend status endpoint is not configured", 500);
  }

  let upstreamResponse: Response;
  let upstreamBody: unknown = "";

  try {
    upstreamResponse = await fetch(STATUS_ENDPOINT, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Partner-Code": PARTNER_CODE,
        Authorization: generateBackendJwt(),
      },
      body: JSON.stringify(payload),
    });

    upstreamBody = await parseUpstreamBody(upstreamResponse);
  } catch (error) {
    return response("Could not reach backend status endpoint", 502, {
      endpoint: STATUS_ENDPOINT,
      partnerCode: PARTNER_CODE,
      error: error instanceof Error ? error.message : String(error),
    });
  }

  if (!upstreamResponse.ok) {
    return response("Backend status endpoint rejected the request", 502, {
      endpoint: STATUS_ENDPOINT,
      partnerCode: PARTNER_CODE,
      upstream: {
        status: upstreamResponse.status,
        statusText: upstreamResponse.statusText,
        body: upstreamBody,
      },
    });
  }

  return response("Result Saved Successfully", 200, {
    endpoint: STATUS_ENDPOINT,
    upstream: upstreamBody,
  });
}
