import { NextRequest } from "next/server";
import { Role } from "@prisma/client";
import { z } from "zod";
import {
  archiveBoostedOdd,
  boostedOddInputSchema,
  boostedOddSettlementSchema,
  listAdminBoostedOdds,
  listBoostedOddCategories,
  settleBoostedOdd,
  upsertBoostedOdd
} from "@/server/admin/boosted-odds";
import { AppError } from "@/server/errors";
import { fail, ok, parseJson } from "@/server/http";
import { requireUser } from "@/server/security/auth";
import { requireRole } from "@/server/security/rbac";

const deleteBoostedOddSchema = z.object({
  id: z.string().uuid()
});

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.ADMIN, Role.SUPER_ADMIN]);

    const [boostedOdds, categories] = await Promise.all([listAdminBoostedOdds(), listBoostedOddCategories()]);
    return ok({ boostedOdds, categories });
  } catch (error) {
    return fail(error);
  }
}

export async function POST(request: NextRequest) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.ADMIN, Role.SUPER_ADMIN]);
    const input = await parseJson(request, boostedOddInputSchema);
    const boostedOdd = await upsertBoostedOdd(input);
    return ok({ boostedOdd });
  } catch (error) {
    return fail(error);
  }
}

export async function PATCH(request: NextRequest) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.ADMIN, Role.SUPER_ADMIN]);
    const input = await parseJson(request, boostedOddSettlementSchema);
    const settlement = await settleBoostedOdd(input, auth.user.id);
    return ok({ settlement });
  } catch (error) {
    return fail(error);
  }
}

export async function DELETE(request: NextRequest) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.ADMIN, Role.SUPER_ADMIN]);

    const id = request.nextUrl.searchParams.get("id");
    if (!id) {
      throw new AppError("Identifiant requis", 422, "BOOSTED_ODD_ID_REQUIRED");
    }

    const input = deleteBoostedOddSchema.parse({ id });
    const result = await archiveBoostedOdd(input.id);
    return ok(result);
  } catch (error) {
    return fail(error);
  }
}
