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