import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { formatCode, normalizeCode } from "@/lib/verify-code";

/**
 * Public verification by short code — what the project QR scanner calls,
 * and what the /verify search bar hits. Returns WHAT was verified:
 * document kind, institution, and for results the student's identity
 * (name, guardians, roll, class) with the issued total and grade.
 */
export async function GET(req: Request) {
  const url = new URL(req.url);
  const stored = normalizeCode(url.searchParams.get("code") ?? "");
  if (stored.length < 6) {
    return NextResponse.json({ valid: false }, { status: 200 });
  }

  const row = await prisma.verificationCode.findUnique({ where: { code: stored } });
  if (!row) return NextResponse.json({ valid: false }, { status: 200 });

  // count the scan (audit trail of third-party checks)
  await prisma.verificationCode.update({
    where: { id: row.id },
    data: { scans: { increment: 1 }, lastScanAt: new Date() },
  });

  const institution = await prisma.institution.findUnique({
    where: { id: row.institutionId },
    select: { name: true },
  });
  if (!institution) return NextResponse.json({ valid: false }, { status: 200 });

  const base = {
    valid: true as const,
    kind: row.kind,
    code: formatCode(row.code),
    institution: { name: institution.name },
    label: row.label,
    issuedAt: row.createdAt.toISOString(),
  };

  if (row.kind === "RESULT") {
    const student = await prisma.student.findUnique({
      where: { id: row.studentId },
      select: {
        roll: true, name: true, nameBn: true,
        guardianName: true, guardianNameBn: true, guardianPhone: true,
        classItem: { select: { name: true, nameBn: true } },
      },
    });
    if (!student) return NextResponse.json({ valid: false }, { status: 200 });
    return NextResponse.json({
      ...base,
      student: {
        roll: student.roll,
        name: student.name,
        nameBn: student.nameBn,
        guardianName: student.guardianName,
        guardianNameBn: student.guardianNameBn,
        guardianPhone: student.guardianPhone,
        className: student.classItem?.name ?? null,
        classNameBn: student.classItem?.nameBn ?? null,
      },
      marks: { total: row.total, grade: row.grade },
    });
  }

  if (row.kind === "ADMIT_CARD") {
    const student = await prisma.student.findUnique({
      where: { id: row.studentId },
      select: {
        roll: true, name: true, nameBn: true,
        classItem: { select: { name: true, nameBn: true } },
      },
    });
    const examId = Number(row.refKey.startsWith("exam:") ? row.refKey.slice(5) : 0);
    const exam = examId
      ? await prisma.exam.findUnique({
          where: { id: examId },
          select: { name: true, nameBn: true, startDate: true, endDate: true },
        })
      : null;
    return NextResponse.json({
      ...base,
      student: student
        ? {
            roll: student.roll,
            name: student.name,
            nameBn: student.nameBn,
            className: student.classItem?.name ?? null,
            classNameBn: student.classItem?.nameBn ?? null,
          }
        : null,
      admit: exam
        ? {
            name: exam.name,
            nameBn: exam.nameBn,
            from: exam.startDate.toISOString(),
            to: exam.endDate?.toISOString() ?? null,
          }
        : null,
    });
  }

  if (row.kind === "EXAM_SCHEDULE") {
    const examId = Number(row.refKey.startsWith("exam:") ? row.refKey.slice(5) : 0);
    const exam = examId
      ? await prisma.exam.findUnique({
          where: { id: examId },
          select: {
            name: true, nameBn: true,
            classItem: { select: { name: true, nameBn: true } },
            schedules: { select: { date: true }, orderBy: { date: "asc" } },
          },
        })
      : null;
    return NextResponse.json({
      ...base,
      schedule: exam
        ? {
            name: exam.name,
            nameBn: exam.nameBn,
            className: exam.classItem?.name ?? null,
            classNameBn: exam.classItem?.nameBn ?? null,
            subjects: exam.schedules.length,
            from: exam.schedules[0]?.date.toISOString() ?? null,
            to: exam.schedules[exam.schedules.length - 1]?.date.toISOString() ?? null,
          }
        : null,
    });
  }

  // INVENTORY — nothing beyond the base (institution + issuedAt)
  return NextResponse.json(base);
}
