"""Capture-Watchdog: erkennt eine eingefrorene Screenshot-Pipeline.

Bleibt der Screenshot pixel-identisch (OBS haengt, Capture-Fehler,
schwarzes Bild), wuerde der Bot blind weiterlaufen. Aendert sich das
Bild 120s lang nicht (HP-/Mana-Balken und Welt animieren praktisch
immer), pausiert der Bot mit Event statt blind weiterzumachen.

Laueft nur bei aktivem Cavebot und unpausiertem Spiel — im
Pause-/Offline-Zustand ist ein statisches Bild legitim.
"""
from time import monotonic

from src.gameplay.monitoring import logEvent
from src.utils.core import hashit

CHECK_INTERVAL_SECONDS = 5
STALE_AFTER_SECONDS = 120


def watchCapture(context):
    """Loop-Hook: pausiert, wenn der Screenshot einfriert."""
    if context['ng_pause'] or not context['ng_cave']['enabled']:
        return context
    screenshot = context['ng_screenshot']
    if screenshot is None:
        return context
    watch = context.setdefault('ng_captureWatch', {})
    now = monotonic()
    if now - watch.get('lastCheckAt', 0) < CHECK_INTERVAL_SECONDS:
        return context
    watch['lastCheckAt'] = now
    imageHash = hashit(screenshot)
    if watch.get('lastHash') != imageHash:
        watch['lastHash'] = imageHash
        watch['changedAt'] = now
        return context
    if now - watch.get('changedAt', now) < STALE_AFTER_SECONDS:
        return context
    if not watch.get('staleLogged'):
        watch['staleLogged'] = True
        context['ng_pause'] = True
        logEvent('captureStale', {
            'seconds': int(now - watch.get('changedAt', now)),
        })
    return context
