"""Smart-Resume: nach Relogin/Tod zum naechsten Wegpunkt.

Statt nach einem Re-Login stur zum Start-Label zu rennen und die
komplette Route neu zu fahren, springt der Bot zum Wegpunkt, der der
aktuellen Position am naechsten liegt (Manhattan-Distanz,
Etagen-Unterschied x15 wie beim Teleport-Waechter). Spart den
Rueckweg durch die halbe Map — gerade nach dem Tod, wenn man im
Tempel respawnt und der naechste Wegpunkt der Stadt-Route ohnehin
anfaengt.
"""
from src.gameplay.monitoring import logEvent

_FLOOR_PENALTY = 15


def _distance(waypointCoordinate, coordinate):
    return (
        abs(waypointCoordinate[0] - coordinate[0])
        + abs(waypointCoordinate[1] - coordinate[1])
        + abs(waypointCoordinate[2] - coordinate[2]) * _FLOOR_PENALTY
    )


def nearestWaypointIndex(items, coordinate):
    """Index des naechstgelegenen Wegpunkts oder None."""
    bestIndex = None
    bestDistance = None
    for index, waypoint in enumerate(items):
        target = waypoint.get('coordinate')
        if target is None or any(value is None for value in target):
            continue
        distance = _distance(target, coordinate)
        if bestDistance is None or distance < bestDistance:
            bestDistance = distance
            bestIndex = index
    return bestIndex


def resumeAtNearestWaypoint(context):
    """Setzt currentIndex auf den naechsten Wegpunkt (nach Relogin)."""
    waypoints = context['ng_cave']['waypoints']
    coordinate = context['ng_radar']['coordinate']
    if coordinate is None or any(value is None for value in coordinate):
        return context
    index = nearestWaypointIndex(waypoints['items'], coordinate)
    if index is None:
        return context
    waypoints['currentIndex'] = index
    waypoints['state'] = None
    logEvent('smartResume', {
        'waypoint': index,
        'coordinate': list(coordinate),
    })
    return context
