import { NextResponse } from "next/server";
import { z } from "zod";
import { prisma } from "@/lib/prisma";
import { requireAdmin, unauthorized } from "@/lib/admin-api";
import { BASE_CATEGORY_VALUES } from "@/lib/base-category";

const categorySchema = z.enum(BASE_CATEGORY_VALUES);

export async function GET(req: Request) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();
  const url = new URL(req.url);
  const category = categorySchema.parse((url.searchParams.get("category") || "").toUpperCase());
  const items = await prisma.baseMatch.findMany({
    where: { category },
    orderBy: [{ matchAt: "asc" }, { sortOrder: "asc" }],
  });
  return NextResponse.json(items);
}

const createSchema = z.object({
  category: z.enum(BASE_CATEGORY_VALUES),
  opponent: z.string().min(1),
  opponentLogoUrl: z.string().optional(),
  competition: z.string().optional(),
  venue: z.string().optional(),
  matchAt: z.string(),
  isHome: z.boolean().optional(),
  result: z.string().optional(),
  sortOrder: z.number().int().optional(),
});

export async function POST(req: Request) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();
  const body = createSchema.parse(await req.json());
  const last = await prisma.baseMatch.aggregate({
    where: { category: body.category },
    _max: { sortOrder: true },
  });
  const item = await prisma.baseMatch.create({
    data: {
      category: body.category,
      opponent: body.opponent,
      opponentLogoUrl: body.opponentLogoUrl?.trim() || null,
      competition: body.competition?.trim() || null,
      venue: body.venue?.trim() || null,
      matchAt: new Date(body.matchAt),
      isHome: body.isHome ?? true,
      result: body.result?.trim() || null,
      sortOrder: body.sortOrder ?? (last._max.sortOrder ?? -1) + 1,
    },
  });
  return NextResponse.json(item);
}

