import { NextResponse } from "next/server";

import { requireSuperAdmin } from "@/lib/authorization";
import {
  createAdminTableRow,
  listAdminTableRows,
} from "@/services/admin-tables.service";

export const dynamic = "force-dynamic";

type Context = { params: Promise<{ table: string }> };

function statusFor(reason: unknown) {
  const message = reason instanceof Error ? reason.message : "UNKNOWN_ERROR";
  if (message === "TABLE_NOT_FOUND") return 404;
  if (message === "PROTECTED_TABLE") return 403;
  return 400;
}

export async function GET(request: Request, { params }: Context) {
  const auth = await requireSuperAdmin(request);
  if (!auth.ok) return auth.response;

  const { table } = await params;
  const url = new URL(request.url);
  const limit = Number(url.searchParams.get("limit") ?? 50);
  const offset = Number(url.searchParams.get("offset") ?? 0);

  if (!Number.isInteger(limit) || !Number.isInteger(offset)) {
    return NextResponse.json(
      { message: "Pagination invalide" },
      { status: 400 },
    );
  }

  try {
    const result = await listAdminTableRows({
      tableName: table,
      limit,
      offset,
      search: url.searchParams.get("search") ?? undefined,
    });
    return NextResponse.json(result);
  } catch (reason) {
    return NextResponse.json(
      {
        message:
          reason instanceof Error ? reason.message : "Lecture impossible",
      },
      { status: statusFor(reason) },
    );
  }
}

export async function POST(request: Request, { params }: Context) {
  const auth = await requireSuperAdmin(request);
  if (!auth.ok) return auth.response;

  const { table } = await params;
  try {
    const body = (await request.json()) as unknown;
    if (!body || typeof body !== "object" || Array.isArray(body)) {
      return NextResponse.json(
        { message: "Corps JSON invalide" },
        { status: 400 },
      );
    }
    const result = await createAdminTableRow(
      table,
      body as Record<string, unknown>,
    );
    return NextResponse.json(result, { status: 201 });
  } catch (reason) {
    return NextResponse.json(
      {
        message:
          reason instanceof Error ? reason.message : "Création impossible",
      },
      { status: statusFor(reason) },
    );
  }
}
