"use client";
import { useRouter, useSearchParams } from "next/navigation";
import { useCallback, useMemo, useEffect, useState } from "react";
import { Card, CardHeader, CardContent } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { ChevronLeft, ChevronRight, Loader2 } from "lucide-react";
// ---------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------
type Synonym = {
word: string;
meanings: string[];
};
type Verse = {
id: string;
book: string;
division: string | null;
chapter: number;
verse: number;
verseEnd: number | null;
reference: string;
bookTitle: string;
devanagari: string;
bengali: string | null;
transliteration: string;
synonyms: Synonym[];
translation: string;
purport: string[];
};
type VerseIndexEntry = {
verse: number;
verseEnd?: number;
reference: string;
};
// ---------------------------------------------------------------------------
// Props
// ---------------------------------------------------------------------------
type ChapterViewerProps = {
/** The first verse (SSR'd), shown before any client-side fetch */
initialVerse: Verse;
/** The verse number of the initial verse */
initialVerseNum: number;
/** Lightweight index of ALL verses in the chapter (for the sidebar) */
verseIndex: VerseIndexEntry[];
/** Book key */
book: string;
/** Division: null for BG, canto string for SB, lila key for CC */
division: string | null;
/** Chapter number */
chapter: number;
/** Whether to show the Bengali script field (CC only) */
showBengali?: boolean;
};
// ---------------------------------------------------------------------------
// Navigation buttons (reused at top and bottom)
// ---------------------------------------------------------------------------
function VerseNav({
currentIdx,
total,
onPrev,
onNext,
verseIndex,
}: {
currentIdx: number;
total: number;
onPrev: () => void;
onNext: () => void;
verseIndex: VerseIndexEntry[];
}) {
const hasPrev = currentIdx > 0;
const hasNext = currentIdx < total - 1;
const current = verseIndex[currentIdx];
const label = current
? current.verseEnd
? `${current.verse}–${current.verseEnd}`
: String(current.verse)
: "";
return (
Verse {label} of {total}
);
}
// ---------------------------------------------------------------------------
// Verse card
// ---------------------------------------------------------------------------
function VerseCard({
verse,
showBengali,
}: {
verse: Verse;
showBengali: boolean;
}) {
return (
{verse.reference}
{/* Bengali (CC only) */}
{showBengali && verse.bengali && (
)}
{/* Devanagari */}
{/* Transliteration */}
{/* Synonyms */}
{verse.synonyms.length > 0 && (
Synonyms
{verse.synonyms.map((s, i) => (
{s.word}—
{s.meanings.join(", ")}
{i < verse.synonyms.length - 1 ? "; " : "."}
))}
)}
{/* Translation */}
{/* Purport */}
{verse.purport.length > 0 && (
Purport
{verse.purport.map((p, i) => (
))}
)}
);
}
// ---------------------------------------------------------------------------
// ChapterViewer
// ---------------------------------------------------------------------------
export function ChapterViewer({
initialVerse,
initialVerseNum,
verseIndex,
book,
division,
chapter,
showBengali = false,
}: ChapterViewerProps) {
const router = useRouter();
const searchParams = useSearchParams();
// Verse cache: verseNum → Verse data
const [cache, setCache] = useState