# edited by glg
import os
from types import SimpleNamespace

os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")

from PySide6.QtWidgets import QApplication, QDialog, QMessageBox, QWidget

from pypos.core.views import printer_settings_panel as printer_panel_module
from pypos.core.views.printer_settings_panel import PrinterSettingsPanel
from pypos.modules.auth.views.device_registration_dialog import DeviceRegistrationDialog
from pypos.modules.auth.views.login_window import LoginWindow
from pypos.modules.dashboard.widgets.scanner_status_circle_widget import ScannerStatusCircle
from pypos.modules.settings import views as settings_views_pkg
from pypos.modules.settings.views.scanner_settings_view import ScannerSettingsView


def _qapp():
    app = QApplication.instance()
    if app is None:
        app = QApplication([])
    return app


def test_gui_device_registration_search_and_submit_success(monkeypatch):
    _qapp()
    dialog = DeviceRegistrationDialog()
    dialog._show_notification = lambda *args, **kwargs: None
    shown = []
    dialog.show_info = lambda title, message: shown.append((title, message))
    dialog.show_warning = lambda title, message: shown.append((title, message))
    dialog.show_error = lambda message, title="Error": shown.append((title, message))

    dialog.controller.search_store_branches = lambda web_admin_url, toko_id: {
        "ok": True,
        "level": "information",
        "message": "Ditemukan 1 cabang.",
        "branches": [("cabang utama", "100")],
    }
    dialog.controller.submit_registration = lambda **kwargs: {
        "ok": True,
        "level": "information",
        "message": "Registrasi berhasil dikirim.",
    }

    dialog.input_web_admin.setText("https://demo.mayagrahakencana.com/jodomart_pypos")
    dialog.input_toko_id.setText("1001")
    dialog.btn_search_store.click()

    assert dialog.input_alias.isHidden() is False
    assert dialog.input_alias.isEnabled() is True
    assert dialog.combo_cabang.count() >= 2
    dialog.combo_cabang.setCurrentIndex(1)
    dialog.input_alias.setText("kasir-a")
    dialog.input_ket.setText("meja kasir depan")
    dialog.btn_submit.click()

    assert dialog.result() == QDialog.Accepted
    assert bool(dialog.result_payload.get("ok")) is True
    dialog.close()


def test_gui_device_registration_auto_close_when_already_registered(monkeypatch):
    _qapp()
    dialog = DeviceRegistrationDialog()
    shown = []
    dialog.show_info = lambda title, message: shown.append((title, message))
    dialog.show_warning = lambda title, message: shown.append((title, message))
    dialog.show_error = lambda message, title="Error": shown.append((title, message))

    dialog.controller.search_store_branches = lambda web_admin_url, toko_id: {
        "ok": True,
        "auto_close": True,
        "already_registered": True,
        "message": "Device sudah terdaftar.",
    }
    dialog.input_web_admin.setText("https://demo.mayagrahakencana.com/jodomart_pypos")
    dialog.input_toko_id.setText("1001")
    dialog.btn_search_store.click()
    assert dialog.result() == QDialog.Accepted
    assert bool(dialog.result_payload.get("already_registered")) is True
    dialog.close()


def test_gui_login_click_and_toggle_password():
    _qapp()
    calls = []
    controller = SimpleNamespace(proses_login=lambda username, password: calls.append((username, password)))
    window = LoginWindow(controller)

    assert window.password_visible is False
    window.toggle_password_btn.click()
    assert window.password_visible is True
    assert window.toggle_password_btn.text().lower() == "hide"

    window.input_username.setText("kasir")
    window.input_password.setText("12345")
    window.button_login.click()
    assert calls == [("kasir", "12345")]
    window.close()


def test_gui_scanner_settings_detect_pair_and_health(monkeypatch):
    _qapp()
    monkeypatch.setattr(
        settings_views_pkg.scanner_settings_view,
        "get_scanner_advanced_profile",
        lambda: {"backend_mode": "auto", "rawinput_enabled": 1},
    )

    saved_payloads = []
    pair_calls = []
    info_calls = []
    warn_calls = []

    monkeypatch.setattr(QMessageBox, "information", lambda *args, **kwargs: info_calls.append((args, kwargs)))
    monkeypatch.setattr(QMessageBox, "warning", lambda *args, **kwargs: warn_calls.append((args, kwargs)))

    class _ScannerControllerStub:
        def load_scanner_settings(self):
            return {"enabled": True, "rawinput_whitelist": []}

        def save_scanner_settings(self, payload):
            saved_payloads.append(dict(payload or {}))
            return {"enabled": bool(payload.get("enabled")), "rawinput_whitelist": list(payload.get("rawinput_whitelist") or [])}

        def get_scanner_discovered_devices(self):
            return [{"name": "Scanner USB 1", "token": "scanner-usb-1"}]

        def pair_scanner_device(self, selected_device, replace):
            pair_calls.append((dict(selected_device or {}), bool(replace)))
            return {"enabled": True, "rawinput_whitelist": [selected_device.get("token")]}

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

    view = ScannerSettingsView(_ScannerControllerStub())
    view.detect_button.click()
    view._on_detect_timer_tick()
    assert info_calls, "Deteksi scanner seharusnya menampilkan info saat device ditemukan."

    view.discovered_device_combo.setCurrentIndex(0)
    view.pair_replace_button.click()
    assert pair_calls, "Pair scanner harus terpanggil saat klik Gunakan Device Ini."

    view.check_button.click()
    assert info_calls, "Cek scanner PASS seharusnya menampilkan informasi."
    assert saved_payloads, "Save payload scanner harus tercatat saat sesi deteksi dimulai."
    view._stop_detect_session()
    view.close()


def test_gui_printer_settings_buttons_and_mode(monkeypatch):
    _qapp()
    info_calls = []
    warn_calls = []
    monkeypatch.setattr(QMessageBox, "information", lambda *args, **kwargs: info_calls.append((args, kwargs)))
    monkeypatch.setattr(QMessageBox, "warning", lambda *args, **kwargs: warn_calls.append((args, kwargs)))

    dialog_exec_calls = []

    class _DiagDialogDummy:
        def __init__(self, title, content, parent=None):
            _ = (title, content, parent)

        def exec(self):
            dialog_exec_calls.append(True)
            return QDialog.Accepted

    monkeypatch.setattr(printer_panel_module, "PrinterDiagnosticKasirDialog", _DiagDialogDummy)

    class _PrinterControllerStub:
        def __init__(self):
            self.preview_calls = 0
            self.test_calls = 0
            self.diagnostic_calls = 0
            self.mode = "preview"

        def get_printers(self):
            return [{"name": "POS-58", "paper_size": "58mm", "default": True}]

        def get_default_printer(self):
            return {"name": "POS-58"}

        def set_default_printer(self, index):
            _ = index
            return True

        def test_print(self, index):
            _ = index
            self.test_calls += 1
            return True

        def preview_print(self, index, parent):
            _ = (index, parent)
            self.preview_calls += 1
            return True

        def run_printer_diagnostic(self):
            self.diagnostic_calls += 1
            return {
                "report": {
                    "summary": {"PASS": 1, "WARN": 0, "FAIL": 0},
                    "checks": [],
                    "printers": [],
                    "recommendations": ["Konfigurasi printer terlihat sehat. Lanjutkan uji cetak transaksi dan settlement di mesin outlet."],
                },
                "report_path": "C:/tmp/diag.json",
            }

        def get_print_mode(self):
            return self.mode

        def set_print_mode(self, mode):
            self.mode = str(mode)
            return True

    controller = _PrinterControllerStub()
    panel = PrinterSettingsPanel(controller)

    panel.test_btn.click()
    panel.preview_btn.click()
    panel.diagnose_btn.click()
    panel.radio_autoprint.click()

    assert controller.test_calls == 1
    assert controller.preview_calls == 1
    assert controller.diagnostic_calls == 1
    assert controller.mode == "auto"
    assert dialog_exec_calls
    assert info_calls, "Tes print berhasil harus memunculkan info."
    panel.close()


def test_gui_scanner_header_icon_tooltip_updates():
    _qapp()
    widget = ScannerStatusCircle()
    widget.update_status(
        {
            "settings": {"enabled": True, "backend_mode": "rawinput", "rawinput_enabled": True},
            "rawinput": {
                "active": True,
                "capture_enabled": True,
                "installed": True,
                "is_windows": True,
                "whitelist_ready": True,
                "whitelist_count": 1,
                "discovered_devices": [{"name": "Scanner USB 1"}],
            },
            "scanner_activity": {"last_scan_recent": True, "last_scan_source": "rawinput_poll", "last_scan_age_ms": 50},
            "wedge": {"enabled": False},
        }
    )
    tooltip = widget.toolTip() or ""
    assert "Enabled:" in tooltip
    assert "Ready:" in tooltip
    assert "Detected:" in tooltip
    widget.close()
