# edited by glg
import time


class ScannerEventGuardService:
    _SCANNER_SOURCES = {"rawinput_poll", "wedge_key", "wedge_poll", "manual_barcode"}

    def __init__(self, dedup_window_ms=180):
        self._dedup_window_ms = max(1, int(dedup_window_ms or 180))
        self._last_event = {"barcode": "", "source": "", "ts_ms": 0}

    def apply_window(self, dedup_window_ms):
        self._dedup_window_ms = max(1, int(dedup_window_ms or 180))

    def _now_ms(self):
        return int(time.perf_counter() * 1000)

    def _is_scanner_source(self, source):
        return str(source or "").strip().lower() in self._SCANNER_SOURCES

    def should_accept(self, barcode, source):
        value = str(barcode or "").strip()
        src = str(source or "").strip().lower()
        if not value or not src:
            return False
        now_ms = self._now_ms()
        prev = self._last_event
        is_duplicate = (
            str(prev.get("barcode") or "") == value
            and str(prev.get("source") or "").strip().lower() != src
            and self._is_scanner_source(src)
            and self._is_scanner_source(prev.get("source"))
            and (now_ms - int(prev.get("ts_ms") or 0)) <= self._dedup_window_ms
        )
        self._last_event = {"barcode": value, "source": src, "ts_ms": now_ms}
        return not is_duplicate
