import sys
import time
from argparse import ArgumentParser

try:
    import serial
except ImportError:
    raise SystemExit("Please install pyserial (perhaps using pip install pyserial)")


class Mouse:
    def __init__(self, port):
        self.serial = serial.Serial(
            port,
            baudrate=1200,
            stopbits=1,
            bytesize=8,
            parity=serial.PARITY_NONE,
            dsrdtr=True,
        )
        self.serial.dtr = True
        # This part might be needed to make it detect a microsoft mouse
        self.serial.rts = False
        self.serial.rts = True
        self.serial.write(b"M")

    def send_update(self, down: int, right: int, button_left: bool, button_right: bool):
        if not (-127 <= down <= 128 and -127 <= right <= 128):
            raise ValueError(
                "values out of ranga of what can be sent in a single packet"
            )

        data = bytes(
            [
                (
                    0b1000000
                    | button_left << 5
                    | button_right << 4
                    | ((right & 0b11000000) >> 6) << 2
                    | ((down & 0b11000000) >> 6)
                ),
                (right & 0b00111111),
                (down & 0b00111111),
            ]
        )
        self.serial.write(data)


def main(port):
    serial_mouse = Mouse(port)
    while True:
        serial_mouse.send_update(down=2, right=2, button_left=False, button_right=False)
        time.sleep(0.3)


if __name__ == "__main__":
    argparser = ArgumentParser()
    argparser.add_argument("--port", default="COM1")
    options = argparser.parse_args(sys.argv[1:])
    main(**vars(options))
