import json
import sys
import argparse
from pynput import mouse, keyboard

def print_event(event_type, **kwargs):
    event = {'type': event_type, **kwargs}
    print(json.dumps(event), flush=True)

def on_move(x, y):
    print_event('move', x=x, y=y)

def on_click(x, y, button, pressed):
    print_event('click', x=x, y=y, button=str(button), pressed=pressed)

def on_scroll(x, y, dx, dy):
    print_event('scroll', x=x, y=y, dx=dx, dy=dy)

def on_press(key):
    try:
        k = key.char
    except AttributeError:
        k = str(key)
    print_event('keypress', key=k)

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--mouse-only', action='store_true')
    parser.add_argument('--keyboard-only', action='store_true')
    args = parser.parse_args()

    mouse_listener = None
    keyboard_listener = None

    try:
        if not args.keyboard_only:
            mouse_listener = mouse.Listener(
                on_move=on_move,
                on_click=on_click,
                on_scroll=on_scroll
            )
            mouse_listener.start()

        if not args.mouse_only:
            keyboard_listener = keyboard.Listener(
                on_press=on_press
            )
            keyboard_listener.start()

        if mouse_listener:
            mouse_listener.join()
        if keyboard_listener:
            keyboard_listener.join()

    except KeyboardInterrupt:
        if mouse_listener:
            mouse_listener.stop()
        if keyboard_listener:
            keyboard_listener.stop()

if __name__ == '__main__':
    main()