# edited by glg
import time

from PySide6.QtCore import QEvent, Qt
from PySide6.QtGui import QKeyEvent

from pypos.modules.scanner.services.scanner_detector_service import ScannerDetectorService


def _key_event(text="", key=0, modifiers=Qt.NoModifier):
    return QKeyEvent(QEvent.KeyPress, key, modifiers, text)


def test_scanner_detector_enter_suffix_no_modifier():
    svc = ScannerDetectorService(
        {
            "enabled": True,
            "max_inter_char_ms": 80,
            "min_length": 5,
            "require_enter_suffix": True,
        }
    )
    for ch in "123456":
        out = svc.consume_qt_key_event(_key_event(text=ch))
        assert out["handled"] is False
    out = svc.consume_qt_key_event(_key_event(key=Qt.Key_Return))
    assert out["handled"] is True
    assert out["barcode"] == "123456"


def test_scanner_detector_keypad_enter_supported():
    svc = ScannerDetectorService(
        {
            "enabled": True,
            "max_inter_char_ms": 80,
            "min_length": 5,
            "require_enter_suffix": True,
        }
    )
    for ch in "98765":
        svc.consume_qt_key_event(_key_event(text=ch))
    out = svc.consume_qt_key_event(_key_event(key=Qt.Key_Enter, modifiers=Qt.KeypadModifier))
    assert out["handled"] is True
    assert out["barcode"] == "98765"


def test_scanner_detector_no_enter_suffix_flush_on_next_scan_after_gap():
    svc = ScannerDetectorService(
        {
            "enabled": True,
            "max_inter_char_ms": 30,
            "min_length": 5,
            "require_enter_suffix": False,
        }
    )
    for ch in "1234567890":
        out = svc.consume_qt_key_event(_key_event(text=ch))
        assert out["handled"] is False
        time.sleep(0.001)
    time.sleep(0.05)
    out = svc.consume_qt_key_event(_key_event(text="1"))
    assert out["handled"] is True
    assert out["barcode"] == "1234567890"


def test_scanner_detector_no_enter_suffix_poll_after_gap():
    svc = ScannerDetectorService(
        {
            "enabled": True,
            "max_inter_char_ms": 30,
            "min_length": 5,
            "require_enter_suffix": False,
        }
    )
    for ch in "5555512345":
        svc.consume_qt_key_event(_key_event(text=ch))
        time.sleep(0.001)
    assert svc.poll_pending_barcode() is None
    time.sleep(0.05)
    assert svc.poll_pending_barcode() == "5555512345"
