import { NextResponse } from "next/server"; import { prisma } from "@/lib/db"; export async function GET( req: Request, { params }: { params: Promise<{ book: string }> }, ) { const { book } = await params; const url = new URL(req.url); const division = url.searchParams.get("division"); const chapterStr = url.searchParams.get("chapter"); const verseStr = url.searchParams.get("verse"); const indexOnly = url.searchParams.get("indexOnly") === "true"; const pageStr = url.searchParams.get("page"); const limitStr = url.searchParams.get("limit"); if (!chapterStr) { return NextResponse.json( { error: "chapter query param is required" }, { status: 400 }, ); } const chapter = parseInt(chapterStr); const where: Record = { book, chapter }; if (book === "bg") { where.division = null; } else if (division) { where.division = division; } // --- Single verse mode: ?verse=N --- if (verseStr) { const verseNum = parseInt(verseStr); const verse = await prisma.verse.findFirst({ where: { ...where, verse: verseNum }, }); if (!verse) { return NextResponse.json({ error: "Verse not found" }, { status: 404 }); } return NextResponse.json(verse); } // --- Index-only mode: return lightweight verse list for the sidebar --- if (indexOnly) { const verses = await prisma.verse.findMany({ where, orderBy: { verse: "asc" }, select: { verse: true, verseEnd: true, reference: true, }, }); return NextResponse.json({ verses, total: verses.length }); } // --- Paginated mode: return full verse data in pages --- const page = Math.max(1, parseInt(pageStr || "1")); const limit = Math.min(100, Math.max(1, parseInt(limitStr || "20"))); const skip = (page - 1) * limit; const [verses, total] = await Promise.all([ prisma.verse.findMany({ where, orderBy: { verse: "asc" }, skip, take: limit, }), prisma.verse.count({ where }), ]); return NextResponse.json({ verses, total, page, limit, totalPages: Math.ceil(total / limit), hasMore: skip + verses.length < total, }); }