"""Behavior tests for the status-bar battery helper (agent/battery.py)."""

from __future__ import annotations

import sys
import types

import pytest

from agent import battery as battery_mod
from agent.battery import (
    BatteryStatus,
    battery_category,
    read_battery,
)

@pytest.fixture(autouse=True)
def _clear_cache():
    battery_mod.clear_cache()
    yield
    battery_mod.clear_cache()

def _fake_psutil(percent, plugged):
    """Install a fake psutil module whose sensors_battery returns a reading."""
    mod = types.ModuleType("psutil")
    reading = types.SimpleNamespace(percent=percent, power_plugged=plugged)
    mod.sensors_battery = lambda: reading  # type: ignore[attr-defined]
    return mod

def test_read_battery_caches(monkeypatch):
    monkeypatch.setitem(sys.modules, "psutil", _fake_psutil(50, False))
    first = read_battery(use_cache=True)
    assert first.percent == 50

    # Swap the reading; a cached call must still return the first value.
    monkeypatch.setitem(sys.modules, "psutil", _fake_psutil(10, True))
    cached = read_battery(use_cache=True)
    assert cached.percent == 50

    # Bypassing the cache picks up the new reading.
    fresh = read_battery(use_cache=False)
    assert fresh.percent == 10

@pytest.mark.parametrize(
    "percent,plugged,expected",
    [
        (100, False, "good"),
        (51, False, "good"),
        (50, False, "warn"),
        (21, False, "warn"),
        (20, False, "bad"),
        (11, False, "bad"),
        (10, False, "critical"),
        (1, False, "critical"),
        # On AC power the level never reads as low.
        (5, True, "good"),
    ],
)
def test_battery_category_thresholds(percent, plugged, expected):
    status = BatteryStatus(available=True, percent=percent, plugged=plugged)
    assert battery_category(status) == expected
