#include <keymap.h>

#define array_size(a) (sizeof(a) / sizeof((a)[0]))

static char shifted_keymap[] = {
    [KEY_0] = ')',
    [KEY_1] = '!',
    [KEY_2] = '@',
    [KEY_3] = '#',
    [KEY_4] = '$',
    [KEY_5] = '%',
    [KEY_6] = '^',
    [KEY_7] = '&',
    [KEY_8] = '*',
    [KEY_9] = '(',
    [KEY_A] = 'A',
    [KEY_B] = 'X',
    [KEY_C] = 'J',
    [KEY_D] = 'E',
    [KEY_E] = '>',
    [KEY_F] = 'U',
    [KEY_G] = 'I',
    [KEY_H] = 'D',
    [KEY_I] = 'C',
    [KEY_J] = 'H',
    [KEY_K] = 'T',
    [KEY_L] = 'N',
    [KEY_M] = 'M',
    [KEY_N] = 'B',
    [KEY_O] = 'R',
    [KEY_P] = 'L',
    [KEY_Q] = '"',
    [KEY_R] = 'P',
    [KEY_S] = 'O',
    [KEY_T] = 'Y',
    [KEY_U] = 'G',
    [KEY_V] = 'K',
    [KEY_W] = '<',
    [KEY_X] = 'Q',
    [KEY_Y] = 'F',
    [KEY_Z] = ':',
    [KEY_SEMICOLON] = 'S',
    [KEY_SPACE] = ' ',
    [KEY_COMMA] = 'W',
    [KEY_DOT] = 'V',
    [KEY_SLASH] = 'Z',
    [KEY_LEFTBRACE] = '?',
    [KEY_RIGHTBRACE] = '+',
    [KEY_BACKSLASH] = '|',
    [KEY_MINUS] = '{',
    [KEY_EQUAL] = '}',
    [KEY_APOSTROPHE] = '_',
    [KEY_GRAVE] = '~',
    [KEY_ENTER] = '\n',
    [KEY_TAB] = '\t',
};

static char keymap[] = {
    [KEY_0] = '0',
    [KEY_1] = '1',
    [KEY_2] = '2',
    [KEY_3] = '3',
    [KEY_4] = '4',
    [KEY_5] = '5',
    [KEY_6] = '6',
    [KEY_7] = '7',
    [KEY_8] = '8',
    [KEY_9] = '9',
    [KEY_A] = 'a',
    [KEY_B] = 'x',
    [KEY_C] = 'j',
    [KEY_D] = 'e',
    [KEY_E] = '.',
    [KEY_F] = 'u',
    [KEY_G] = 'i',
    [KEY_H] = 'd',
    [KEY_I] = 'c',
    [KEY_J] = 'h',
    [KEY_K] = 't',
    [KEY_L] = 'n',
    [KEY_M] = 'm',
    [KEY_N] = 'b',
    [KEY_O] = 'r',
    [KEY_P] = 'l',
    [KEY_Q] = '\'',
    [KEY_R] = 'p',
    [KEY_S] = 'o',
    [KEY_T] = 'y',
    [KEY_U] = 'g',
    [KEY_V] = 'k',
    [KEY_W] = ',',
    [KEY_X] = 'q',
    [KEY_Y] = 'f',
    [KEY_Z] = ';',
    [KEY_SEMICOLON] = 's',
    [KEY_SPACE] = ' ',
    [KEY_COMMA] = 'w',
    [KEY_DOT] = 'v',
    [KEY_SLASH] = 'z',
    [KEY_LEFTBRACE] = '/',
    [KEY_RIGHTBRACE] = '=',
    [KEY_BACKSLASH] = '\\',
    [KEY_MINUS] = '[',
    [KEY_EQUAL] = ']',
    [KEY_APOSTROPHE] = '-',
    [KEY_GRAVE] = '`',
    [KEY_ENTER] = '\r',
    [KEY_TAB] = '\t',
};

char
keymap_lookup(int code)
{
    if (code < 0 || array_size(keymap) <= code)
        return 0;
    return keymap[code];
}

char
keymap_lookup_shifted(int code)
{
    if (code < 0 || array_size(shifted_keymap) <= code)
        return 0;
    return shifted_keymap[code];
}