// 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 "keyboard-vt100.h"

#include <hid/usages.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;
}
