import { NextResponse } from "next/server";

export async function readJsonBody<T extends Record<string, unknown>>(
  req: Request,
): Promise<T | null> {
  try {
    const body = await req.json();
    return body && typeof body === "object" && !Array.isArray(body)
      ? (body as T)
      : null;
  } catch {
    return null;
  }
}

export function badRequest(message = "Invalid request body") {
  return NextResponse.json({ error: message }, { status: 400 });
}

function redactSensitiveText(value: string) {
  return value
    .replace(/(authorization|bearer|token|secret|password|api[_-]?key)(["'\s:=]+)[^"'\s,}]+/gi, "$1$2[redacted]")
    .replace(/(https:\/\/hooks\.slack\.com\/services\/)[^\s"']+/gi, "$1[redacted]")
    .replace(/(sk_live_|sk_test_|pk_live_|pk_test_)[A-Za-z0-9_]+/g, "$1[redacted]")
    .slice(0, 500);
}

export function logApiError(context: string, error: unknown) {
  const message = redactSensitiveText(error instanceof Error ? error.message : "Unknown error");
  const name = error instanceof Error ? error.name : "Error";
  const code =
    error && typeof error === "object" && "code" in error
      ? String((error as { code?: unknown }).code)
      : undefined;

  if (process.env.NODE_ENV === "production") {
    console.error(context, { name, code });
    return;
  }

  console.error(context, { name, code, message });
}
