# edited by glg
from unittest.mock import patch

import pytest

from pypos.modules.printer.services.printer_diagnostic_service import PrinterDiagnosticService

pytestmark = [pytest.mark.unit]


def _build_service(tmp_path):
    with patch(
        "pypos.modules.printer.models.printer_settings_model.get_app_data_resource_dir",
        return_value=str(tmp_path),
    ):
        return PrinterDiagnosticService(timeout_seconds=0.05)


def test_check_lan_address_format_invalid(tmp_path):
    service = _build_service(tmp_path)
    result = service._check_lan_address("invalid")
    assert result["status"] == "FAIL"
    assert "format address lan tidak valid" in str(result["message"]).lower()


def test_check_lan_address_warn_saat_koneksi_gagal(tmp_path):
    service = _build_service(tmp_path)
    result = service._check_lan_address("127.0.0.1:1")
    assert result["status"] in {"PASS", "WARN"}


def test_check_lan_address_timeout_mengembalikan_error_contract(tmp_path, monkeypatch):
    class _SocketTimeoutStub:
        def settimeout(self, _timeout):
            return None

        def connect(self, _addr):
            raise TimeoutError("timed out")

        def close(self):
            return None

    monkeypatch.setattr(
        "pypos.modules.printer.services.printer_diagnostic_service.socket.socket",
        lambda *_args, **_kwargs: _SocketTimeoutStub(),
    )

    service = _build_service(tmp_path)
    result = service._check_lan_address("10.10.10.1:9100")

    assert result["status"] == "WARN"
    assert result["error_code"] == "PRINTER_DIAG_LAN_CONNECT_FAIL"
    assert result["reason"] == "lan_connect_failed"
    assert str(result["trace_id"]).startswith("printer-check-")


def test_build_recommendations_memunculkan_saran_default_saat_tidak_ada_masalah(tmp_path):
    service = _build_service(tmp_path)
    service.report = {
        "meta": {},
        "paths": {},
        "settings": {},
        "checks": [
            {"category": "runtime", "name": "os_printers", "status": "PASS", "message": "OK"},
        ],
        "printers": [],
        "recommendations": [],
        "summary": {"PASS": 1, "WARN": 0, "FAIL": 0},
    }
    service._build_recommendations()
    assert service.report["recommendations"]
    assert "konfigurasi printer terlihat sehat" in str(service.report["recommendations"][0]).lower()
