Co-authored-by: Azareth-Tr <Azareth-Tr@users.noreply.githu b.com> correcion de errores en llenado de tablas, primeras vistas frontend
65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
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()}
|