const Bindings = require('../bindings')

const mapping = {
	'A': 'a',
	'AC Back': 'back',
	'AC Bookmarks': 'bookmarks',
	'AC Forward': 'forward',
	'AC Home': 'home',
	'AC Refresh': 'refresh',
	'AC Search': 'search',
	'AC Stop': 'stop',
	'Again': 'again',
	'AltErase': 'altErase',
	'App1': 'app1',
	'App2': 'app2',
	'Application': 'application',
	'AudioFastForward': 'audioFastForward',
	'AudioMute': 'audioMute',
	'AudioNext': 'audioNext',
	'AudioPlay': 'audioPlay',
	'AudioPrev': 'audioPrev',
	'AudioRewind': 'audioRewind',
	'AudioStop': 'audioStop',
	'B': 'b',
	'Backspace': 'backspace',
	'BrightnessDown': 'brightnessDown',
	'BrightnessUp': 'brightnessUp',
	'C': 'c',
	'Calculator': 'calculator',
	'Cancel': 'cancel',
	'CapsLock': 'capsLock',
	'Clear / Again': 'clear/again',
	'Clear': 'clear',
	'Computer': 'computer',
	'Copy': 'copy',
	'CrSel': 'crSel',
	'CurrencySubUnit': 'currencySubUnit',
	'CurrencyUnit': 'currencyUnit',
	'Cut': 'cut',
	'D': 'd',
	'DecimalSeparator': 'decimalSeparator',
	'Delete': 'delete',
	'DisplaySwitch': 'displaySwitch',
	'Down': 'down',
	'E': 'e',
	'Eject': 'eject',
	'End': 'end',
	'Escape': 'escape',
	'Execute': 'execute',
	'ExSel': 'exSel',
	'F': 'f',
	'F1': 'f1',
	'F10': 'f10',
	'F11': 'f11',
	'F12': 'f12',
	'F13': 'f13',
	'F14': 'f14',
	'F15': 'f15',
	'F16': 'f16',
	'F17': 'f17',
	'F18': 'f18',
	'F19': 'f19',
	'F2': 'f2',
	'F20': 'f20',
	'F21': 'f21',
	'F22': 'f22',
	'F23': 'f23',
	'F24': 'f24',
	'F3': 'f3',
	'F4': 'f4',
	'F5': 'f5',
	'F6': 'f6',
	'F7': 'f7',
	'F8': 'f8',
	'F9': 'f9',
	'Find': 'find',
	'G': 'g',
	'H': 'h',
	'Help': 'help',
	'Home': 'home',
	'I': 'i',
	'Insert': 'insert',
	'J': 'j',
	'K': 'k',
	'KBDIllumDown': 'illumDown',
	'KBDIllumToggle': 'illumToggle',
	'KBDIllumUp': 'illumUp',
	'Keypad -': '-',
	'Keypad ,': ',',
	'Keypad :': ':',
	'Keypad !': '!',
	'Keypad .': '.',
	'Keypad (': '(',
	'Keypad )': ')',
	'Keypad {': '{',
	'Keypad }': '}',
	'Keypad @': '@',
	'Keypad *': '*',
	'Keypad /': '/',
	'Keypad &': '&',
	'Keypad &&': '&&',
	'Keypad #': '#',
	'Keypad %': '%',
	'Keypad ^': '^',
	'Keypad +': '+',
	'Keypad +/-': '+/-',
	'Keypad <': '<',
	'Keypad = (AS400)': '=',
	'Keypad =': '=',
	'Keypad >': '>',
	'Keypad |': '|',
	'Keypad ||': '||',
	'Keypad 0': '0',
	'Keypad 00': '00',
	'Keypad 000': '000',
	'Keypad 1': '1',
	'Keypad 2': '2',
	'Keypad 3': '3',
	'Keypad 4': '4',
	'Keypad 5': '5',
	'Keypad 6': '6',
	'Keypad 7': '7',
	'Keypad 8': '8',
	'Keypad 9': '9',
	'Keypad A': 'a',
	'Keypad B': 'b',
	'Keypad Backspace': 'backspace',
	'Keypad Binary': 'binary',
	'Keypad C': 'c',
	'Keypad Clear': 'clear',
	'Keypad ClearEntry': 'clearEntry',
	'Keypad D': 'd',
	'Keypad Decimal': 'decimal',
	'Keypad E': 'e',
	'Keypad Enter': 'enter',
	'Keypad F': 'f',
	'Keypad Hexadecimal': 'hexadecimal',
	'Keypad MemAdd': 'memAdd',
	'Keypad MemClear': 'memClear',
	'Keypad MemDivide': 'memDivide',
	'Keypad MemMultiply': 'memMultiply',
	'Keypad MemRecall': 'memRecall',
	'Keypad MemStore': 'memStore',
	'Keypad MemSubtract': 'memSubtract',
	'Keypad Octal': 'octal',
	'Keypad Space': ' ',
	'Keypad Tab': 'tab',
	'Keypad XOR': 'xor',
	'L': 'l',
	'Left Alt': 'alt',
	'Left Ctrl': 'ctrl',
	'Left GUI': 'gui',
	'Left Shift': 'shift',
	'Left': 'left',
	'M': 'm',
	'Mail': 'mail',
	'MediaSelect': 'mediaSelect',
	'Menu': 'menu',
	'ModeSwitch': 'modeSwitch',
	'Mute': 'mute',
	'N': 'n',
	'Numlock': 'numlock',
	'O': 'o',
	'Oper': 'oper',
	'Out': 'out',
	'P': 'p',
	'PageDown': 'pageDown',
	'PageUp': 'pageUp',
	'Paste': 'paste',
	'Pause': 'pause',
	'Power': 'power',
	'PrintScreen': 'printScreen',
	'Prior': 'prior',
	'Q': 'q',
	'R': 'r',
	'Return': 'return',
	'Right Alt': 'alt',
	'Right Ctrl': 'ctrl',
	'Right GUI': 'gUI',
	'Right Shift': 'shift',
	'Right': 'right',
	'S': 's',
	'ScrollLock': 'scrollLock',
	'Select': 'select',
	'Separator': 'separator',
	'Sleep': 'sleep',
	'Space': 'space',
	'Stop': 'stop',
	'SysReq': 'sysReq',
	'T': 't',
	'Tab': 'tab',
	'ThousandsSeparator': 'thousandsSeparator',
	'U': 'u',
	'Undo': 'undo',
	'Up': 'up',
	'V': 'v',
	'VolumeDown': 'volumeDown',
	'VolumeUp': 'volumeUp',
	'W': 'w',
	'WWW': 'www',
	'X': 'x',
	'Y': 'y',
	'Z': 'z',
}

const reverseMapping = {}

for (const [ key, value ] of Object.entries(mapping)) {
	maybeSkip: {
		const existing = reverseMapping[value]
		if (existing === undefined) { break maybeSkip }

		const keyScancode = Bindings.keyboard_getScancode(key)
		if (keyScancode === null) { continue }

		const existingScancode = Bindings.keyboard_getScancode(existing)
		if (existingScancode === null) { break maybeSkip }

		if (existingScancode < keyScancode) { continue }
	}

	reverseMapping[value] = key
}

module.exports = {
	mapping,
	reverseMapping,
}
