# edited by glg
import pytest

from pypos.modules.scanner.services.rawinput_scanner_service import RawInputScannerService

pytestmark = [pytest.mark.unit]


def test_rawinput_normalize_settings_handles_string_values():
    svc = RawInputScannerService(
        settings={
            "enabled": "0",
            "max_inter_char_ms": "bad",
            "min_length": "-1",
            "require_enter_suffix": "false",
            "backend_mode": "invalid",
            "rawinput_enabled": "off",
            "rawinput_whitelist": ["hid#a", "HID#A", "", {"match": "hid#b"}],
        }
    )
    cfg = dict(svc._settings or {})
    assert cfg.get("enabled") is False
    assert cfg.get("max_inter_char_ms") == 50
    assert cfg.get("min_length") == 5
    assert cfg.get("require_enter_suffix") is False
    assert cfg.get("backend_mode") == "auto"
    assert cfg.get("rawinput_enabled") is False
    assert cfg.get("rawinput_whitelist") == ["hid#a", "hid#b"]


def test_rawinput_stop_clears_runtime_caches():
    svc = RawInputScannerService(settings={"enabled": False})
    svc._queue.append("899123")
    svc._buffer_by_device[1] = {"buffer": ["1"], "last_ms": 1}
    svc._discovered_device_map["dev"] = {"name": "dev", "token": "dev", "last_seen_ms": 1}
    svc._device_name_cache[1] = "dev1"

    svc.stop()

    assert len(svc._queue) == 0
    assert svc._buffer_by_device == {}
    assert svc._discovered_device_map == {}
    assert svc._device_name_cache == {}


def test_rawinput_prune_discovered_devices_menghapus_state_stale():
    svc = RawInputScannerService(settings={"enabled": False})
    svc._discovered_device_map = {
        "scanner-a": {"name": "scanner-a", "token": "a", "last_seen_ms": 1_000},
        "scanner-b": {"name": "scanner-b", "token": "b", "last_seen_ms": 4_500},
    }
    svc._DISCOVERED_TTL_MS = 1_000

    svc._prune_discovered_devices(now_ms=5_500)

    assert "scanner-a" not in svc._discovered_device_map
    assert "scanner-b" in svc._discovered_device_map
