import pytest

from pypos.modules.platform_ops.services.fleet_rollout_runtime_guard_service import (
    FleetRolloutRuntimeGuardService,
)

# edited by glg
pytestmark = [pytest.mark.unit]


def _base_policy():
    return {
        "fleet_rollout_runtime_guard_enabled": 1,
        "fleet_rollout_runtime_fail_open": 1,
        "fleet_rollout_runtime_halt_on_unhealthy": 1,
        "fleet_rollout_runtime_config_version": "cfg-2026-04-15",
        "fleet_rollout_runtime_wave_name": "canary",
        "fleet_rollout_runtime_canary_percent": 100,
        "fleet_rollout_runtime_wave_percents": [100],
        "fleet_rollout_runtime_branch_ids": [101],
        "fleet_rollout_runtime_fail_threshold_pct": 2.0,
        "fleet_rollout_runtime_latency_threshold_ms": 2000.0,
        "fleet_rollout_runtime_min_sample_count": 0,
        "fleet_rollout_runtime_fail_when_sample_insufficient": 0,
    }


def test_runtime_guard_allow_saat_wave_sehat():
    svc = FleetRolloutRuntimeGuardService(config_reader=lambda: _base_policy())
    decision = svc.evaluate_export_guard(
        branch_id=101,
        metrics_payload={"error_rate_pct": 0.5, "p95_latency_ms": 120.0, "sample_count": 10},
    )
    assert decision["allow"] is True
    assert decision["healthy"] is True
    assert decision["decision"] == "continue"


def test_runtime_guard_block_saat_wave_tidak_sehat():
    svc = FleetRolloutRuntimeGuardService(config_reader=lambda: _base_policy())
    decision = svc.evaluate_export_guard(
        branch_id=101,
        metrics_payload={"error_rate_pct": 9.0, "p95_latency_ms": 2200.0, "sample_count": 10},
    )
    assert decision["allow"] is False
    assert decision["healthy"] is False
    assert decision["decision"] == "halt_and_rollback"
    assert decision["reason"] == "unhealthy_wave_metrics"


def test_runtime_guard_fail_open_saat_konfigurasi_wave_invalid():
    def _cfg():
        cfg = _base_policy()
        cfg["fleet_rollout_runtime_wave_name"] = "wave_tidak_ada"
        cfg["fleet_rollout_runtime_fail_open"] = 1
        return cfg

    svc = FleetRolloutRuntimeGuardService(config_reader=_cfg)
    decision = svc.evaluate_export_guard(
        branch_id=101,
        metrics_payload={"error_rate_pct": 0.1, "p95_latency_ms": 100.0, "sample_count": 10},
    )
    assert decision["allow"] is True
    assert decision["reason"] == "runtime_guard_error"


def test_runtime_guard_fail_closed_saat_fail_open_dimatikan():
    def _cfg():
        cfg = _base_policy()
        cfg["fleet_rollout_runtime_wave_name"] = "wave_tidak_ada"
        cfg["fleet_rollout_runtime_fail_open"] = 0
        return cfg

    svc = FleetRolloutRuntimeGuardService(config_reader=_cfg)
    decision = svc.evaluate_export_guard(
        branch_id=101,
        metrics_payload={"error_rate_pct": 0.1, "p95_latency_ms": 100.0, "sample_count": 10},
    )
    assert decision["allow"] is False
    assert decision["decision"] == "halt_and_rollback"
