// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <hid/usages.h>

#include "keyboard-vt100.h"
#include "keyboard.h"

uint32_t hid_key_to_vt100_code(uint8_t keycode, int modifiers,
                               const keychar_t* keymap, char* buf, size_t buf_size) {
    // Consistency check: Max size of byte sequences we produce below.
    if (buf_size != 4)
        return 0;

    uint8_t ch = hid_map_key(keycode, modifiers & MOD_SHIFT, keymap);
    if (ch) {
        if (modifiers & MOD_CTRL) {
            // Handle Ctrl-A to Ctrl-Z.  Ignore the Ctrl modifier on any
            // other keys.
            uint8_t range_start = modifiers & MOD_SHIFT ? 'A' : 'a';
            uint8_t range_end = static_cast<uint8_t>(range_start + 26);
            if (range_start <= ch && ch < range_end) {
                buf[0] = static_cast<char>(ch - range_start + 1);
                return 1;
            }
        }
        if (modifiers & MOD_CAPSLOCK) {
            if ('a' <= ch && ch <= 'z') {
                ch = static_cast<char>(ch - 'a' + 'A');
            } else if ('A' <= ch && ch <= 'Z') {
                ch = static_cast<char>(ch - 'A' + 'a');
            }
        }
        buf[0] = ch;
        return 1;
    }

    switch (keycode) {
    // generate special stuff for a few different keys
    case HID_USAGE_KEY_ENTER:
    case HID_USAGE_KEY_KP_ENTER:
        buf[0] = '\n';
        return 1;
    case HID_USAGE_KEY_BACKSPACE:
        buf[0] = '\b';
        return 1;
    case HID_USAGE_KEY_TAB:
        buf[0] = '\t';
        return 1;
    case HID_USAGE_KEY_ESC:
        buf[0] = 0x1b;
        return 1;

    // generate vt100 key codes for arrows
    case HID_USAGE_KEY_UP:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 65;
        return 3;
    case HID_USAGE_KEY_DOWN:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 66;
        return 3;
    case HID_USAGE_KEY_RIGHT:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 67;
        return 3;
    case HID_USAGE_KEY_LEFT:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 68;
        return 3;
    case HID_USAGE_KEY_HOME:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 'H';
        return 3;
    case HID_USAGE_KEY_END:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = 'F';
        return 3;
    case HID_USAGE_KEY_DELETE:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = '3';
        buf[3] = '~';
        return 4;
    case HID_USAGE_KEY_PAGEUP:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = '5';
        buf[3] = '~';
        return 4;
    case HID_USAGE_KEY_PAGEDOWN:
        buf[0] = 0x1b;
        buf[1] = '[';
        buf[2] = '6';
        buf[3] = '~';
        return 4;
    }
    // ignore unknown keys; character keys were handled above
    return 0;
}
