import { db, ensureDatabaseTables } from "@/db";
import { winningEntries } from "@/db/schema";
import { and, eq, isNull } from "drizzle-orm";

export const dynamic = "force-dynamic";

function clean(value: unknown, max = 40) {
  return typeof value === "string" ? value.trim().slice(0, max) : "";
}

export async function POST(request: Request) {
  try {
    await ensureDatabaseTables();
    const body = (await request.json()) as Record<string, unknown>;
    const serialNumber = clean(body.serialNumber, 32).toUpperCase();
    const numbers = Array.isArray(body.numbers)
      ? body.numbers.map((number) => clean(number, 2)).filter(Boolean)
      : [];

    if (!serialNumber || numbers.length !== 6 || numbers.some((number) => !/^\d{1,2}$/.test(number))) {
      return Response.json(
        { matched: false, error: "Please enter your Ticket Serial Number and all 6 winning numbers." },
        { status: 400 }
      );
    }

    const normalized = numbers.map((number) => String(Number(number))).join(",");
    const [entry] = await db
      .select({
        id: winningEntries.id,
        serialNumber: winningEntries.serialNumber,
        winningNumbers: winningEntries.winningNumbers,
        prizeAmount: winningEntries.prizeAmount,
        issueDate: winningEntries.issueDate,
        active: winningEntries.active,
      })
      .from(winningEntries)
      .where(
        and(
          eq(winningEntries.serialNumber, serialNumber),
          eq(winningEntries.winningNumbers, normalized),
          eq(winningEntries.active, true),
          isNull(winningEntries.claimedAt)
        )
      )
      .limit(1);

    if (!entry) {
      return Response.json(
        {
          matched: false,
          error: "Those details do not match an active winning entry in our registry. Please check your award email and try again.",
        },
        { status: 404 }
      );
    }

    return Response.json({
      matched: true,
      serialNumber: entry.serialNumber,
      winningNumbers: entry.winningNumbers,
      prizeAmount: entry.prizeAmount || "$1,300,000,000",
      issueDate: entry.issueDate || "2026-01-15",
      prizeTier: "Grand Prize Jackpot",
    });
  } catch (error) {
    console.error("Entry verification failed:", error);
    return Response.json({ matched: false, error: "Verification service temporarily unavailable." }, { status: 500 });
  }
}
