#!/usr/bin/env python3
import select
import argparse

from udp_interface import UDPInterface
from hid_interface import HIDInterface
import uhid
import logger


parser = argparse.ArgumentParser()
parser.add_argument(
    "-e",
    default=21325,
    metavar="port",
    type=int,
    help="UDP port the utility communicates with, 21325 by default.",
)
parser.add_argument(
    "-l",
    "--log-level",
    choices=["none", "raw", "uhid-event", "hid-packet"],
    default="none",
    help="Do not log at all (none); log everything sent to and received by the uhid device and the UDP socket (raw); log uhid events written to and read by the uhid device (uhid-event), log hid packets send to and received by the virtual hid device (hid-packet).",
)
parser.add_argument(
    "-t",
    "--log-timestams",
    dest="log_timestamps",
    action="store_true",
    default="False",
    help="Do include timestamps in the log, this is the default option.",
)
parser.add_argument(
    "--no-log-timestams",
    dest="log_timestamps",
    action="store_false",
    help="Do not include timestamps in the log.",
)
args = parser.parse_args()

logger.log_level = args.log_level
logger.log_timestamps = args.log_timestamps

udp_interface = UDPInterface(args.e)
hid_interface = HIDInterface()

poller = select.poll()
poller.register(udp_interface.file_descriptor, select.POLLIN | select.POLLPRI)
poller.register(hid_interface.file_descriptor, select.POLLIN | select.POLLPRI)

while True:
    events = poller.poll()

    for descriptor, event in events:
        if descriptor == hid_interface.file_descriptor:
            data = hid_interface.process_event()
            if data:
                udp_interface.write(data)
        if descriptor == udp_interface.file_descriptor:
            data = udp_interface.read(uhid.EVENT_LENGTH)
            hid_interface.write_data(data)
