from flashops_control.engine.recovery import RecoveryContext, next_recovery_level
from flashops_control.enums import RecoveryLevel, RecoveryTrigger


def test_integrity_failure_always_freezes():
    level = next_recovery_level(
        RecoveryContext(
            trigger=RecoveryTrigger.DATA_INTEGRITY,
            attempt=0,
            agent_online=True,
            host_network_online=True,
            oob_online=True,
        )
    )
    assert level == RecoveryLevel.FREEZE


def test_offline_oob_removes_destructive_recovery_levels():
    level = next_recovery_level(
        RecoveryContext(
            trigger=RecoveryTrigger.HEARTBEAT_LOST,
            attempt=2,
            agent_online=True,
            host_network_online=True,
            oob_online=False,
        )
    )
    assert level == RecoveryLevel.FREEZE


def test_recovery_escalates_in_order():
    context = dict(
        trigger=RecoveryTrigger.HEARTBEAT_LOST,
        agent_online=True,
        host_network_online=True,
        oob_online=True,
    )
    assert next_recovery_level(RecoveryContext(attempt=0, **context)) == RecoveryLevel.AGENT_SOFT
    assert next_recovery_level(RecoveryContext(attempt=1, **context)) == RecoveryLevel.OS_REBOOT
    assert next_recovery_level(RecoveryContext(attempt=2, **context)) == RecoveryLevel.OOB_RESET
