import { NextResponse } from "next/server";
import { ZodError } from "zod";
import { AppError } from "@/server/errors";
import { logger } from "@/server/logger";

export function ok<T>(data: T, init?: ResponseInit) {
  return NextResponse.json({ ok: true, data }, init);
}

export function fail(error: unknown) {
  if (error instanceof AppError) {
    return NextResponse.json(
      { ok: false, error: { code: error.code, message: error.message, details: error.details } },
      { status: error.status }
    );
  }

  if (error instanceof ZodError) {
    return NextResponse.json(
      { ok: false, error: { code: "VALIDATION_ERROR", message: "Invalid request payload", details: error.flatten() } },
      { status: 422 }
    );
  }

  logger.error({ error }, "Unhandled API error");
  return NextResponse.json(
    { ok: false, error: { code: "INTERNAL_SERVER_ERROR", message: "Unexpected server error" } },
    { status: 500 }
  );
}

export async function parseJson<T>(request: Request, schema: { parse: (value: unknown) => T }) {
  const body = await request.json();
  return schema.parse(body);
}
