import pytest

from pypos.modules.platform_ops.services.fleet_rollout_service import FleetRolloutService

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


def test_build_rollout_plan_assigns_unique_branch_once():
    service = FleetRolloutService()
    plan = service.build_rollout_plan(
        branch_ids=[5, 1, 2, 2, 0, -1, "x", 8, 4],
        config_version="cfg-2026.04.02",
        canary_percent=20,
        wave_percents=[50, 100],
    )

    assert plan["config_version"] == "cfg-2026.04.02"
    assert plan["total_branches"] == 5
    assert plan["canary"]["size"] == 1

    assigned = list(plan["canary"]["branch_ids"])
    for wave in plan["waves"]:
        assigned.extend(list(wave["branch_ids"]))

    assert len(assigned) == len(set(assigned))
    assert sorted(assigned) == [1, 2, 4, 5, 8]
    assert plan["unassigned"] == []


def test_build_rollout_plan_wave_progression_after_canary():
    service = FleetRolloutService()
    plan = service.build_rollout_plan(
        branch_ids=list(range(1, 101)),
        config_version="cfg-v2",
        canary_percent=1,
        wave_percents=[5, 20, 50, 100],
    )

    assert plan["canary"]["size"] == 1
    waves = {wave["name"]: wave for wave in plan["waves"]}
    assert waves["wave_5"]["size"] == 4
    assert waves["wave_20"]["size"] == 15
    assert waves["wave_50"]["size"] == 30
    assert waves["wave_100"]["size"] == 50


def test_evaluate_wave_health_decision():
    healthy = FleetRolloutService.evaluate_wave_health(
        {"error_rate_pct": 1.5, "p95_latency_ms": 1500},
        fail_threshold_pct=2.0,
    )
    unhealthy = FleetRolloutService.evaluate_wave_health(
        {"error_rate_pct": 2.3, "p95_latency_ms": 1500},
        fail_threshold_pct=2.0,
    )

    assert healthy["healthy"] is True
    assert healthy["action"] == "continue"
    assert unhealthy["healthy"] is False
    assert unhealthy["action"] == "halt_and_rollback"
