# edited by glg
import pytest

import pypos.modules.settings.controllers.settings_controller as settings_controller_module
from pypos.modules.settings.controllers.settings_controller import SettingsController

pytestmark = [pytest.mark.unit]


class _PrinterSettingsServiceStub:
    def __init__(self, printer_facade_service=None):
        _ = printer_facade_service

    def get_legacy_controller(self):
        return object()


class _HistorySettingsServiceStub:
    def __init__(self, printer_facade_service=None):
        _ = printer_facade_service


class _PenjualanSettingsServiceStub:
    def __init__(self):
        pass


class _ScannerControllerStub:
    def __init__(self):
        self.disposed = False
        self.saved_payload = {}

    def dispose(self):
        self.disposed = True

    def load_settings(self):
        return {"enabled": True}

    def save_settings(self, payload):
        self.saved_payload = dict(payload or {})
        return dict(self.saved_payload)

    def run_diagnostic(self):
        return {"overall_status": "PASS"}

    def get_discovered_devices(self):
        return [{"name": "Scanner USB", "token": "hid#vid_05e0&pid_1200"}]

    def pair_device(self, selected_device, replace=False):
        _ = replace
        token = str((selected_device or {}).get("token") or "").strip().lower()
        if not token:
            return None
        return {"rawinput_whitelist": [token]}


def test_settings_controller_scanner_flow_and_dispose(monkeypatch):
    monkeypatch.setattr(settings_controller_module, "PrinterSettingsService", _PrinterSettingsServiceStub)
    monkeypatch.setattr(settings_controller_module, "HistorySettingsService", _HistorySettingsServiceStub)
    monkeypatch.setattr(settings_controller_module, "PenjualanSettingsService", _PenjualanSettingsServiceStub)

    scanner = _ScannerControllerStub()
    ctrl = SettingsController(scanner_controller=scanner)

    loaded = ctrl.load_scanner_settings()
    saved = ctrl.save_scanner_settings({"enabled": False, "rawinput_whitelist": ["hid#vid_05e0&pid_1200"]})
    diag = ctrl.run_scanner_diagnostic()
    devices = ctrl.get_scanner_discovered_devices()
    paired = ctrl.pair_scanner_device({"name": "Scanner USB", "token": "hid#vid_05e0&pid_1200"}, replace=True)
    failed_pair = ctrl.pair_scanner_device({"name": "Scanner USB", "token": ""}, replace=True)

    assert loaded == {"enabled": True}
    assert saved.get("enabled") is False
    assert diag.get("overall_status") == "PASS"
    assert len(devices) == 1
    assert paired.get("rawinput_whitelist") == ["hid#vid_05e0&pid_1200"]
    assert failed_pair == {}

    ctrl.dispose()
    assert scanner.disposed is True
