from __future__ import annotations

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from health_client import AccountSnapshot, HealthStatus
from limit_warning import (
    FIVE_HOUR_WARNING_THRESHOLD_PCT,
    SEVEN_DAY_WARNING_THRESHOLD_PCT,
    WINDOW_5H,
    WINDOW_7D,
    breached_windows,
)


def test_breached_windows_acceptance_matrix():
    cases = [
        (
            "both windows breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=86,
                secondary_used_pct=96,
            ),
            frozenset({WINDOW_5H, WINDOW_7D}),
        ),
        (
            "only 5h breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=86,
                secondary_used_pct=94,
            ),
            frozenset({WINDOW_5H}),
        ),
        (
            "only 7d breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=85,
                secondary_used_pct=96,
            ),
            frozenset({WINDOW_7D}),
        ),
        (
            "neither breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=84,
                secondary_used_pct=94,
            ),
            frozenset(),
        ),
        (
            "5h boundary exactly 15 percent remaining is not breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=100 - FIVE_HOUR_WARNING_THRESHOLD_PCT,
                secondary_used_pct=96,
            ),
            frozenset({WINDOW_7D}),
        ),
        (
            "7d boundary exactly 5 percent remaining is not breached",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=86,
                secondary_used_pct=100 - SEVEN_DAY_WARNING_THRESHOLD_PCT,
            ),
            frozenset({WINDOW_5H}),
        ),
        (
            "broken status short circuits both windows",
            AccountSnapshot(
                status=HealthStatus.BROKEN,
                primary_used_pct=100,
                secondary_used_pct=100,
            ),
            frozenset(),
        ),
        (
            "unknown status short circuits both windows",
            AccountSnapshot(
                status=HealthStatus.UNKNOWN,
                primary_used_pct=100,
                secondary_used_pct=100,
            ),
            frozenset(),
        ),
        (
            "primary none skips 5h while 7d can breach",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=None,
                secondary_used_pct=96,
            ),
            frozenset({WINDOW_7D}),
        ),
        (
            "secondary none skips 7d while 5h can breach",
            AccountSnapshot(
                status=HealthStatus.OK,
                primary_used_pct=86,
                secondary_used_pct=None,
            ),
            frozenset({WINDOW_5H}),
        ),
    ]

    for _, snapshot, expected in cases:
        assert breached_windows(snapshot) == expected


def test_keyword_thresholds_override_defaults():
    snapshot = AccountSnapshot(
        status=HealthStatus.OK,
        primary_used_pct=75,
        secondary_used_pct=85,
    )

    assert breached_windows(snapshot) == frozenset()
    assert breached_windows(snapshot, five_hour_threshold_pct=30) == frozenset(
        {WINDOW_5H}
    )
    assert breached_windows(snapshot, seven_day_threshold_pct=20) == frozenset(
        {WINDOW_7D}
    )
    assert breached_windows(
        snapshot, five_hour_threshold_pct=30, seven_day_threshold_pct=20
    ) == frozenset({WINDOW_5H, WINDOW_7D})


def test_keyword_threshold_boundary_is_exclusive():
    snapshot = AccountSnapshot(
        status=HealthStatus.OK,
        primary_used_pct=70,
        secondary_used_pct=80,
    )

    assert breached_windows(
        snapshot, five_hour_threshold_pct=30, seven_day_threshold_pct=20
    ) == frozenset()

