from fastapi import APIRouter, Depends from app.services import simulation from app.core.deps import require_role router = APIRouter(prefix="/simulation", tags=["simulation"]) # Solo admin puede ver el estado real de la simulación (incluye routeId y posición) _require_admin = require_role("admin") @router.get("/state") def get_state(_: dict = Depends(_require_admin)): """ Estado actual de la simulación: positionId y status de cada ruta. ⚠️ No devuelve coordenadas — solo el índice (1–8) y el status de texto. """ colonias = simulation.get_colonias() route_ids = {c["routeId"] for c in colonias} state = [] for route_id in sorted(route_ids): pos = simulation.get_route_position(route_id) status = simulation.get_route_status(route_id) # Derivar mensaje ETA sin coordenadas if pos is None: mensaje = "Ruta no cargada" elif pos < 4: mensaje = "En camino al sector" elif pos == 4: mensaje = "Llega en ~15 min" elif pos < 8: mensaje = "Atendiendo la zona" else: mensaje = "Servicio finalizado" state.append({ "routeId": route_id, "positionId": pos, "status": status, "etaMensaje": mensaje, }) return {"routes": state, "totalRoutes": len(state)} @router.post("/tick") def manual_tick(_: dict = Depends(_require_admin)): """Avanza manualmente un tick en todas las rutas (útil para la demo).""" events = simulation.tick() return {"events": events, "total": len(events)} @router.post("/reset") def reset_simulation(_: dict = Depends(_require_admin)): """Reinicia todas las rutas a positionId=1 (para repetir la demo).""" simulation.start_simulation_state() return {"message": "Simulación reiniciada. Todas las rutas están en posición 1."} @router.get("/events") def get_events(_: dict = Depends(_require_admin)): """Últimos 20 eventos disparados por la simulación.""" return {"events": simulation.get_last_events()}