import win32api
import win32con

from main import KeyboardHandler

class WindowsKeyboardHandler(KeyboardHandler):

    def __init__ (self, *args, **kwargs):
        super(WindowsKeyboardHandler, self).__init__(*args, **kwargs)
        #Setup the replacement dictionaries.
        for i in dir(win32con):
            if i.startswith("VK_"):
                key = i[3:].lower()
                self.replacement_keys[key] = getattr(win32con, i)
            elif i.startswith("MOD_"):
                key = i[4:].lower()
                self.replacement_mods[key] = getattr(win32con, i)
        self.replacement_keys .update(dict(pageup=win32con.VK_PRIOR, pagedown=win32con.VK_NEXT))

    def parse_key (self, keystroke, separator="+"):
        keystroke = str(keystroke) #We don't want unicode
        keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)]
        mods = 0
        for i in keystroke[:-1]:
            mods = mods | i #or everything together
        return (mods, keystroke[-1])

    def keycode_from_key(self, key):
        if key in self.replacement_mods:
            return self.replacement_mods[key]
        if key in self.replacement_keys:
            return self.replacement_keys[key]
        if len(key) == 1:
            return win32api.VkKeyScanEx(key, win32api.GetKeyboardLayout())

    def is_key_pressed(self, key):
        """Returns if the given key was pressed.  Requires an active message loop or will simply give if the key was pressed recently."""
        key = self.keycode_from_key(key)
        return win32api.GetAsyncKeyState(key)