from typing import List from fastapi import APIRouter, HTTPException, status from app.api.websocket import manager from app.game import game_engine from app.models import ApiResponse, BoardState, Player, PlayerCreate router = APIRouter() @router.get("/health", response_model=ApiResponse, tags=["System"]) async def health_check(): return ApiResponse( success=True, message="botWebWars backend service is healthy", data={"service": "FastAPI", "status": "running"}, ) @router.post( "/players", response_model=Player, status_code=status.HTTP_201_CREATED, summary="Register a new player on the board", tags=["Players"], ) @router.post( "/register", response_model=Player, status_code=status.HTTP_201_CREATED, include_in_schema=False, ) async def register_player(player_in: PlayerCreate): player = await game_engine.register_player(player_in) # Broadcast to all connected WebSocket clients await manager.broadcast({ "event": "player_joined", "player": player.model_dump(), "player_count": len(await game_engine.get_all_players()), }) return player @router.get( "/players", response_model=List[Player], summary="List all registered players", tags=["Players"], ) async def list_players(): return await game_engine.get_all_players() @router.get( "/players/{player_id}", response_model=Player, summary="Get details of a specific player", tags=["Players"], ) async def get_player(player_id: str): player = await game_engine.get_player(player_id) if not player: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Player '{player_id}' not found", ) return player @router.delete( "/players/{player_id}", response_model=ApiResponse, summary="Remove a player from the board", tags=["Players"], ) async def remove_player(player_id: str): removed = await game_engine.remove_player(player_id) if not removed: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Player '{player_id}' not found", ) await manager.broadcast({ "event": "player_left", "player_id": player_id, "player_count": len(await game_engine.get_all_players()), }) return ApiResponse( success=True, message=f"Player '{player_id}' successfully removed", ) @router.get( "/board", response_model=BoardState, summary="Get full board configuration and player positions", tags=["Board"], ) async def get_board(): return await game_engine.get_board_state() @router.post( "/board/reset", response_model=ApiResponse, summary="Reset the board and clear all players", tags=["Board"], ) async def reset_board(): await game_engine.reset() await manager.broadcast({ "event": "board_reset", "player_count": 0, }) return ApiResponse( success=True, message="Board reset successfully. All players cleared.", )