import pytest

from pypos.modules.auth.config import auth_config
from pypos.modules.auth.controllers.login_controller import LoginController
from pypos.modules.auth.services.device_registration_service import DeviceRegistrationService
from pypos.modules.auth.services.network_probe_service import NetworkProbeService


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


class _RuntimeErrorHttp:
    def request(self, **kwargs):
        _ = kwargs
        raise RuntimeError("http-runtime-error")


def test_auth_policy_parser_handles_zero_int_flags(monkeypatch):
    monkeypatch.setattr(
        auth_config,
        "read_app_settings",
        lambda: {
            "login_network_policy_enabled": 1,
            "login_require_online": 0,
            "login_show_startup_online_notice": 0,
            "login_network_disable_button_when_blocked": 0,
        },
    )
    policy = auth_config.get_login_network_policy_config()
    assert policy["enabled"] is True
    assert policy["require_online"] is False
    assert policy["show_startup_notice"] is False
    assert policy["disable_button_when_blocked"] is False


def test_network_probe_runtime_error_returns_safe_result():
    service = NetworkProbeService(
        http_client=_RuntimeErrorHttp(),
        endpoint_config_getter=lambda: {"api_base_url": "https://example.test", "request_timeout": 1},
        policy_config_getter=lambda: {
            "server_probe_timeout_sec": 0.3,
            "internet_probe_timeout_sec": 0.3,
            "internet_probe_urls": [],
            "health_check_enabled": False,
            "health_endpoint": "",
            "health_timeout_sec": 0.3,
        },
    )
    result = service.probe_server()
    assert isinstance(result, dict)
    assert result["ok"] is False
    assert int(result["status_code"] or 0) == 0


def test_device_registration_load_branches_invalid_toko_id_returns_empty():
    service = DeviceRegistrationService()
    assert service.load_branches(toko_id="abc") == []


def test_login_controller_as_int_fallback_and_minimum():
    assert LoginController._as_int("invalid", fallback=1200, minimum=500) == 1200
    assert LoginController._as_int("100", fallback=1200, minimum=500) == 500
