import { NextRequest, NextResponse } from 'next/server' import { auth } from '@/auth' import prisma from '@/lib/prisma' import { computeSm2Update } from '@/lib/flashcards/sm2' export async function POST( request: NextRequest, { params }: { params: Promise<{ id: string }> }, ) { try { const session = await auth() if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } const { id: cardId } = await params const body = await request.json() const grade = typeof body.grade === 'number' ? body.grade : Number(body.grade) if (!Number.isFinite(grade) || grade < 1 || grade > 4) { return NextResponse.json({ error: 'Grade must be 1–4' }, { status: 400 }) } const card = await prisma.flashcard.findFirst({ where: { id: cardId, deck: { userId: session.user.id }, }, }) if (!card) { return NextResponse.json({ error: 'Card not found' }, { status: 404 }) } const updated = computeSm2Update(grade, { easinessFactor: card.easinessFactor, interval: card.interval, }) const [savedCard] = await prisma.$transaction([ prisma.flashcard.update({ where: { id: cardId }, data: { easinessFactor: updated.easinessFactor, interval: updated.interval, nextReviewAt: updated.nextReviewAt, }, }), prisma.flashcardReview.create({ data: { cardId, grade: Math.round(grade) }, }), ]) return NextResponse.json({ card: { id: savedCard.id, interval: savedCard.interval, easinessFactor: savedCard.easinessFactor, nextReviewAt: savedCard.nextReviewAt.toISOString(), }, }) } catch (error) { console.error('[flashcards/[id]/review]', error) return NextResponse.json({ error: 'Review failed' }, { status: 500 }) } }