'''
Module for translating Qt key codes to PyMOL key and "special" codes
'''

from __future__ import absolute_import

from pymol.Qt import QtCore
Qt = QtCore.Qt

DEBUG = False

keyMap = {
    Qt.Key_Escape: 27,
    Qt.Key_Tab: 9,
    Qt.Key_Backspace: 8,
    Qt.Key_Return: 13,
    Qt.Key_Enter: 13,
    Qt.Key_Delete: 127,
}

specialMap = {
    Qt.Key_Left: 100,
    Qt.Key_Up: 101,
    Qt.Key_Right: 102,
    Qt.Key_Down: 103,
    Qt.Key_PageUp: 104,
    Qt.Key_PageDown: 105,
    Qt.Key_Home: 106,
    Qt.Key_End: 107,
    Qt.Key_Insert: 108,
    Qt.Key_F1: 1,
    Qt.Key_F2: 2,
    Qt.Key_F3: 3,
    Qt.Key_F4: 4,
    Qt.Key_F5: 5,
    Qt.Key_F6: 6,
    Qt.Key_F7: 7,
    Qt.Key_F8: 8,
    Qt.Key_F9: 9,
    Qt.Key_F10: 10,
    Qt.Key_F11: 11,
    Qt.Key_F12: 12,
}


def get_modifiers(ev):
    '''Get modifers from event and translate into PyMOL modifier mask'''
    pymolmod = 0
    qtmodifiers = ev.modifiers()

    for mask, qtm in [
        (0x1, Qt.ShiftModifier),
        (0x2, Qt.MetaModifier),  # CTRL on Mac
        (0x2, Qt.ControlModifier),
        (0x4, Qt.AltModifier)
    ]:
        if qtmodifiers & qtm:
            pymolmod |= mask

    return pymolmod


def keyPressEventToPyMOLButtonArgs(ev):
    # translate modifier mask
    pymolmod = get_modifiers(ev)

    # Qt::Key_*
    key = ev.key()

    if key in specialMap:
        k = specialMap[key]

        # PyMOL_Special
        state = -2
    else:
        # PyMOL_Key
        state = -1

        # doesn't work on Mac: k = keyMap.get(key, ev.nativeVirtualKey())
        k = keyMap.get(key, -1)
        if k == -1:
            text = ev.text()
            if text:
                k = ord(text)

        # CTRL-<key>
        if k == -1 and (pymolmod & 0x2):
            k = key - 64

        # ALT-<key>
        if k != -1 and (pymolmod & 0x4):
            k = key

        if k > 255 or k < 0:
            if DEBUG:
                print('DEBUG: skipped: 0x%x 0x%x' % (key, k))
            return

    return (k, state, 0, 0, pymolmod)
