import keypad
import rotaryio

from kmk.scanners import Scanner


class RotaryioEncoder(Scanner):
    def __init__(self, pin_a, pin_b, divisor=4):
        self.encoder = rotaryio.IncrementalEncoder(pin_a, pin_b, divisor)
        self.position = 0
        self._pressed = False
        self._queue = []

    @property
    def key_count(self):
        return 2

    def scan_for_changes(self):
        position = self.encoder.position

        if position != self.position:
            self._queue.append(position - self.position)
            self.position = position

        if not self._queue:
            return

        key_number = self.offset
        if self._queue[0] > 0:
            key_number += 1

        if self._pressed:
            self._queue[0] -= 1 if self._queue[0] > 0 else -1

            if self._queue[0] == 0:
                self._queue.pop(0)

            self._pressed = False

        else:
            self._pressed = True

        return keypad.Event(key_number, self._pressed)