from fastapi import APIRouter, Depends, HTTPException, Body from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel from app.models.database import get_session from app.models.schemas import GameStateResponse, DmSpeakRequest from app.services.game_state_manager import game_state_manager from app.services.agent_scheduler import agent_scheduler router = APIRouter() class StartGameRequest(BaseModel): script_id: str class SetSpeakerRequest(BaseModel): character_id: str @router.get("/state", response_model=GameStateResponse) async def get_state(session: AsyncSession = Depends(get_session)): state = await game_state_manager.get_or_create_state(session) return game_state_manager.to_response(state) @router.post("/start", response_model=GameStateResponse) async def start_game( req: StartGameRequest, session: AsyncSession = Depends(get_session), ): state = await game_state_manager.start_game(session, req.script_id) return game_state_manager.to_response(state) @router.post("/pause", response_model=GameStateResponse) async def pause_game(session: AsyncSession = Depends(get_session)): state = await game_state_manager.pause_game(session) return game_state_manager.to_response(state) @router.post("/resume", response_model=GameStateResponse) async def resume_game(session: AsyncSession = Depends(get_session)): state = await game_state_manager.resume_game(session) return game_state_manager.to_response(state) @router.post("/phase/next", response_model=GameStateResponse) async def phase_next(session: AsyncSession = Depends(get_session)): state = await game_state_manager.next_phase(session) return game_state_manager.to_response(state) @router.post("/phase/prev", response_model=GameStateResponse) async def phase_prev(session: AsyncSession = Depends(get_session)): state = await game_state_manager.prev_phase(session) return game_state_manager.to_response(state) @router.post("/dm/speak") async def dm_speak(req: DmSpeakRequest): result = await agent_scheduler.dm_speak(req.content) return {"content": result, "msg_type": "dm", "phase": req.phase} @router.post("/speaker/set", response_model=GameStateResponse) async def set_speaker( req: SetSpeakerRequest, session: AsyncSession = Depends(get_session), ): state = await game_state_manager.set_speaker(session, req.character_id) return game_state_manager.to_response(state) @router.post("/reset", response_model=GameStateResponse) async def reset_game(session: AsyncSession = Depends(get_session)): state = await game_state_manager.reset(session) return game_state_manager.to_response(state)