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

#ifndef INSTALLER_UTIL_KEY_READER_H_
#define INSTALLER_UTIL_KEY_READER_H_

#include <linux/input.h>

#include <string>
#include <vector>

#include <base/files/scoped_file.h>
#include <xkbcommon/xkbcommon.h>

namespace key_reader {

constexpr int kMaxInputLength = 64;

// Increasing `kBackspaceSensitivity` will slow backspace speed.
constexpr int kBackspaceSensitivity = 2;

class KeyReader {
 public:
  KeyReader(bool include_usb, bool print_length, std::string country_code)
      : backspace_counter_(0),
        return_pressed_(false),
        print_length_(print_length),
        include_usb_(include_usb),
        country_code_(country_code) {
    user_input_.reserve(kMaxInputLength);
  }

  ~KeyReader();

  // Checks for valid keyboards and starts listening for input.
  // Returns false if there are no valid devices.
  bool KeyEventStart();

  // Creates the correct keyboard layout for a given country code.
  // Returns false for invalid keyboard layout, true otherwise.
  bool SetKeyboardContext();

  // Given a keycode, does all conversions for the layout including
  // capitalization and special characters.
  bool GetInput();

  // GetChar takes in an input event and adds to user input if the key press
  // is a valid, printable ASCII. Returns false on return, true otherwise.
  bool GetChar(const struct input_event& ev);

  // Returns the input stored as a string. Used in unittests.
  std::string GetUserInputForTest();

 private:
  std::string user_input_;
  // Counts and aggregates repeated backspace key events.
  int backspace_counter_;
  // Checks that enter key down was recorded before returning on key up.
  bool return_pressed_;
  // Outputs input length to stdout when true.
  bool print_length_;
  // Whether or not to include USB connections when scanning for events.
  bool include_usb_;
  // Keyboard layout for xkb common;
  std::string country_code_;
  // Stores open event connections.
  std::vector<base::ScopedFD> fds_;
  // XKB common keyboard layout members.
  struct xkb_context* ctx_;
  struct xkb_rule_names names_;
  struct xkb_keymap* keymap_;
  struct xkb_state* state_;
};

}  // namespace key_reader

#endif  // INSTALLER_UTIL_KEY_READER_H_
