import { NextRequest, NextResponse } from "next/server" import { prisma } from "@/lib/db" import { buildFsrsCard, gradeCard, skillCodeFromGrade } from "@/lib/fsrs" export async function POST(request: NextRequest) { try { const { childId, exerciseId, skillCode, correct, promptLevel, responseMs, errorType, stage } = await request.json() if (!childId || !exerciseId || !skillCode) { return NextResponse.json({ error: "Missing required fields" }, { status: 400 }) } // Auto-create session log if none exists (so SkillAttempts are always stored) let sessionLog = await prisma.sessionLog.findFirst({ where: { childId }, orderBy: { startedAt: "desc" }, }) if (!sessionLog) { sessionLog = await prisma.sessionLog.create({ data: { childId, startedAt: new Date() }, }) } await prisma.skillAttempt.create({ data: { sessionLogId: sessionLog.id, skillCode, promptLevel: promptLevel ?? 0, correct, responseMs: responseMs ?? null, errorType: errorType ?? null, exerciseId, stage: stage ?? null, }, }) // Update/create FSRS card so due-date sorting works in the engine const existingCard = await prisma.fsrsCard.findFirst({ where: { childId, skillCode }, }) const grade = skillCodeFromGrade(correct, responseMs ?? 5000) const baseCard = buildFsrsCard({ stability: existingCard?.stability, difficulty: existingCard?.difficulty, reps: existingCard?.reps, lapses: existingCard?.lapses, due: existingCard?.dueAt, }) const { card: updatedCard } = gradeCard(baseCard, grade) if (existingCard) { await prisma.fsrsCard.update({ where: { id: existingCard.id }, data: { dueAt: updatedCard.due, stability: updatedCard.stability, difficulty: updatedCard.difficulty, reps: updatedCard.reps, lapses: updatedCard.lapses, }, }) } else { await prisma.fsrsCard.create({ data: { childId, skillCode, dueAt: updatedCard.due, stability: updatedCard.stability, difficulty: updatedCard.difficulty, reps: updatedCard.reps, lapses: updatedCard.lapses, }, }) } return NextResponse.json({ success: true }) } catch (error) { console.error("Curriculum grade error:", error) return NextResponse.json({ error: "Internal error" }, { status: 500 }) } }