import { getGameDb } from '@/lib/db/client' import { MAX_TEAM_SIZE } from '@/lib/game/crew' import { checkJumpTarget, getWorldState, JumpError, queueStateFromSave, saveTaskRow } from '@/lib/game/save' import { queueTask, TaskError } from '@/lib/game/tasks' // Jump to a system within range: assign the crew team (lead + helpers) and queue the JUMP // task — the move lands when the task completes on the turn tick (runTurn). Body: // { systemId, leadCrewId, helperCrewIds? }. Queueing spends no turn; returns the same fresh // world state as the instant jump did. export async function POST(req: Request) { let body: unknown try { body = await req.json() } catch { return Response.json({ error: 'Invalid JSON body' }, { status: 400 }) } const systemId = (body as { systemId?: unknown }).systemId if (typeof systemId !== 'number' || !Number.isInteger(systemId)) { return Response.json({ error: 'systemId must be an integer' }, { status: 400 }) } const leadCrewId = (body as { leadCrewId?: unknown }).leadCrewId if (typeof leadCrewId !== 'number' || !Number.isInteger(leadCrewId)) { return Response.json({ error: 'leadCrewId must be an integer' }, { status: 400 }) } let helperCrewIds: number[] = [] const rawHelpers = (body as { helperCrewIds?: unknown }).helperCrewIds if (rawHelpers !== undefined) { if (!Array.isArray(rawHelpers) || !rawHelpers.every((h) => typeof h === 'number' && Number.isInteger(h))) { return Response.json({ error: 'helperCrewIds must be an array of integers' }, { status: 400 }) } helperCrewIds = rawHelpers } // Team rules (route layer, not queueTask's): one task team, distinct members, size cap. const team = [leadCrewId, ...helperCrewIds] if (new Set(team).size !== team.length) { return Response.json({ error: 'crew members must be unique' }, { status: 400 }) } if (team.length > MAX_TEAM_SIZE) { return Response.json({ error: `a task team holds at most ${MAX_TEAM_SIZE} crew members` }, { status: 400 }) } try { const db = await getGameDb() const hops = await checkJumpTarget(db, systemId) // existing pre-checks: 404 unknown · 409 already there / out of range const state = await queueStateFromSave(db) const { task } = queueTask(state, { type: 'JUMP', payload: { systemId, hops }, leadCrewId, helperCrewIds }) await saveTaskRow(db, task) // inventory is unchanged for a JUMP — no hold write return Response.json(await getWorldState(db)) } catch (err) { if (err instanceof JumpError || err instanceof TaskError) { return Response.json({ error: err.message }, { status: err.status }) } throw err } }