import { NextResponse } from 'next/server'; import { getRandomQuestion } from '@/lib/scibowl-api'; import { z, ZodError } from 'zod'; import { getRoom, buzz, startGame, loadQuestion, startTossupTimer, startBonusTimer, markTossupCorrect, markTossupWrong, markBonusCorrect, markBonusWrong, moveOn, endGame } from '@/lib/rooms'; const gameActionSchema = z.object({ action: z.enum(['start', 'load_question', 'start_timer', 'buzz', 'tossup_correct', 'tossup_wrong', 'bonus_start_timer', 'bonus_correct', 'bonus_wrong', 'move_on', 'end']), moderatorId: z.string().optional(), playerId: z.string().optional(), }); export async function POST( req: Request, { params }: { params: Promise<{ code: string }> } ) { try { const { code } = await params; const body = await req.json(); const { action, moderatorId, playerId } = gameActionSchema.parse(body); let success = false; switch (action) { case 'start': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = startGame(code, moderatorId); break; case 'load_question': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); const question = await getRandomQuestion(); success = loadQuestion(code, moderatorId, question); break; case 'start_timer': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = startTossupTimer(code, moderatorId); break; case 'buzz': if (!playerId) return NextResponse.json({ error: 'Missing playerId' }, { status: 400 }); success = buzz(code, playerId); break; case 'tossup_correct': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = markTossupCorrect(code, moderatorId); break; case 'tossup_wrong': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = markTossupWrong(code, moderatorId); break; case 'bonus_start_timer': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = startBonusTimer(code, moderatorId); break; case 'bonus_correct': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = markBonusCorrect(code, moderatorId); break; case 'bonus_wrong': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = markBonusWrong(code, moderatorId); break; case 'move_on': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = moveOn(code, moderatorId); break; case 'end': if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 }); success = endGame(code, moderatorId); break; } if (!success) { return NextResponse.json({ error: 'Action failed' }, { status: 400 }); } const room = getRoom(code); return NextResponse.json({ success: true, gameState: room?.gameState }); } catch (error: unknown) { console.error('Game action error:', error); if (error instanceof ZodError) { return NextResponse.json( { error: error.errors[0].message }, { status: 400 } ); } return NextResponse.json({ error: 'Invalid request' }, { status: 400 }); } }