const CODE_TO_HOTKEY_KEY: Record<string, string> = {
    ArrowDown: 'arrowdown',
    ArrowLeft: 'arrowleft',
    ArrowRight: 'arrowright',
    ArrowUp: 'arrowup',
    Backquote: '`',
    Backslash: '\\',
    Backspace: 'backspace',
    BracketLeft: '[',
    BracketRight: ']',
    Comma: ',',
    Delete: 'delete',
    End: 'end',
    Enter: 'enter',
    Equal: 'equal',
    Escape: 'escape',
    Home: 'home',
    Insert: 'insert',
    Minus: 'minus',
    PageDown: 'pagedown',
    PageUp: 'pageup',
    Period: '.',
    Quote: "'",
    Semicolon: ';',
    Slash: '/',
    Space: 'space',
    Tab: 'tab',
};

const NUMPAD_CODE_TO_HOTKEY_KEY: Record<string, string> = {
    Add: 'numpadadd',
    Decimal: 'numpaddecimal',
    Divide: 'numpaddivide',
    Enter: 'numpadenter',
    Multiply: 'numpadmultiply',
    Subtract: 'numpadsubtract',
};

export const MODIFIER_KEY_CODES = new Set([
    'AltLeft',
    'AltRight',
    'ControlLeft',
    'ControlRight',
    'MetaLeft',
    'MetaRight',
    'ShiftLeft',
    'ShiftRight',
]);

export const keyboardCodeToHotkeyKey = (code: string): null | string => {
    const mapped = CODE_TO_HOTKEY_KEY[code];
    if (mapped) {
        return mapped;
    }

    if (code.startsWith('Key')) {
        return code.slice(3).toLowerCase();
    }

    if (code.startsWith('Digit')) {
        return code.slice(5);
    }

    if (/^F([1-9]|1\d|2[0-4])$/.test(code)) {
        return code.toLowerCase();
    }

    if (code.startsWith('Numpad')) {
        const suffix = code.slice(6);
        const numpadMapped = NUMPAD_CODE_TO_HOTKEY_KEY[suffix];
        if (numpadMapped) {
            return numpadMapped;
        }

        if (/^\d$/.test(suffix)) {
            return `numpad${suffix}`;
        }
    }

    return null;
};
