Files
hackathon-innovaflow5.0-cdf…/backend/app/api/simulation.py
shinra32 21a73162df Co-authored-by: MENDOZA BALLARDO GAEL RICARDO <gael-meb123@users.noreply.github.com>
Co-authored-by: Azareth-Tr <Azareth-Tr@users.noreply.githu

b.com>

correcion de errores en llenado de tablas, primeras vistas frontend
2026-05-22 20:17:04 -06:00

65 lines
2.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 (18) 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()}