import { NextResponse } from "next/server";
import { getVisitorByPass, generateQrDataUrl } from "@/lib/visitors";
import { isSealedPassPayload, openPassPayload } from "@/lib/pass-crypto";
import { safeError } from "@/lib/safe-log";

type Params = { params: Promise<{ passNo: string }> };

function resolveQrPlaintext(visitor: {
  pass_no: string;
  aadhaar_last4: string;
  name: string;
  arrival_date: string | Date;
  status: string;
  qr_payload: string | null;
}): string {
  const raw = visitor.qr_payload?.trim() || "";
  if (!raw) {
    return JSON.stringify({
      pass_no: visitor.pass_no,
      name: visitor.name,
      arrival: visitor.arrival_date,
      status: visitor.status,
      aadhaar_last4: visitor.aadhaar_last4,
    });
  }

  // Legacy plaintext JSON (pre-encryption)
  if (!isSealedPassPayload(raw)) {
    return raw;
  }

  try {
    const opened = openPassPayload(raw, {
      pass_no: visitor.pass_no,
      aadhaar_last4: visitor.aadhaar_last4,
    });
    return JSON.stringify(opened);
  } catch (e) {
    safeError("openPassPayload failed", visitor.pass_no, e);
    // Fallback minimal payload so QR still renders
    return JSON.stringify({
      pass_no: visitor.pass_no,
      name: visitor.name,
      arrival: visitor.arrival_date,
      status: visitor.status,
      aadhaar_last4: visitor.aadhaar_last4,
    });
  }
}

export async function GET(_req: Request, { params }: Params) {
  const { passNo } = await params;
  const visitor = await getVisitorByPass(passNo.toUpperCase());
  if (!visitor) {
    return NextResponse.json({ ok: false, error: "Pass not found." }, { status: 404 });
  }

  const payload = resolveQrPlaintext(visitor);
  const dataUrl = await generateQrDataUrl(payload);
  const base64 = dataUrl.split(",")[1];
  const buffer = Buffer.from(base64, "base64");

  return new NextResponse(buffer, {
    headers: {
      "Content-Type": "image/png",
      "Cache-Control": "public, max-age=3600",
    },
  });
}
