// Copyright 2015 The Chromium 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 SERVICES_PREDICTION_KEY_SET_H_
#define SERVICES_PREDICTION_KEY_SET_H_

#include "mojo/services/prediction/interfaces/prediction.mojom.h"

// qwerty keyboard key sets

namespace prediction {

// NOTE: This struct has been modified from the Android Open
// Source Project. Specifically from the following file:
// https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/
// android-5.1.1_r8/java/src/com/android/inputmethod/keyboard/Key.java
struct Key {
  int kcode;
  // Width of the key, not including the gap
  int kwidth;
  // Height of the key, not including the gap
  int kheight;
  // X coordinate of the key in the keyboard layout
  int kx;
  // Y coordinate of the key in the keyboard layout
  int ky;
  // Hit bounding box of the key
  int khit_box_left;
  int khit_box_top;
  int khit_box_right;
  int khit_box_bottom;

  Key() {}

  Key(const int code,
      const int x,
      const int y,
      const int width,
      const int height,
      const int horizontal_gap,
      const int vertical_gap) {
    kheight = height - vertical_gap;
    kwidth = width - horizontal_gap;
    kcode = code;
    kx = x + horizontal_gap / 2;
    ky = y;
    khit_box_left = x;
    khit_box_top = y;
    khit_box_right = x + width + 1;
    khit_box_bottom = y + height;
  }
};

namespace keyset {

const Key A(97, 43, 58, 29, 58, 4, 9);
const Key B(98, 188, 116, 29, 58, 4, 9);
const Key C(99, 130, 116, 29, 58, 4, 9);
const Key D(100, 101, 58, 29, 58, 4, 9);
const Key E(101, 87, 0, 29, 58, 4, 9);
const Key F(102, 130, 58, 29, 58, 4, 9);
const Key G(103, 159, 58, 29, 58, 4, 9);
const Key H(104, 188, 58, 29, 58, 4, 9);
const Key I(105, 232, 0, 29, 58, 4, 9);
const Key J(106, 217, 58, 29, 58, 4, 9);
const Key K(107, 246, 58, 29, 58, 4, 9);
const Key L(108, 275, 58, 29, 58, 4, 9);
const Key M(109, 246, 116, 29, 58, 4, 9);
const Key N(110, 217, 116, 29, 58, 4, 9);
const Key O(111, 261, 0, 29, 58, 4, 9);
const Key P(112, 290, 0, 29, 58, 4, 9);
const Key Q(113, 29, 0, 29, 58, 4, 9);
const Key R(114, 116, 0, 29, 58, 4, 9);
const Key S(115, 72, 58, 29, 58, 4, 9);
const Key T(116, 145, 0, 29, 58, 4, 9);
const Key U(117, 203, 0, 29, 58, 4, 9);
const Key V(118, 159, 116, 29, 58, 4, 9);
const Key W(119, 58, 0, 29, 58, 4, 9);
const Key X(120, 101, 116, 29, 58, 4, 9);
const Key Y(121, 174, 0, 29, 58, 4, 9);
const Key Z(122, 72, 116, 29, 58, 4, 9);

const Key key_set[] = {Q, W, E, R, T, Y, U, I, O, P, A, S, D,
                       F, G, H, J, K, L, Z, X, C, V, B, N, M};

const int key_count = 26;

}  // namespace keyset
}  // namespace prediction

#endif  // SERVICES_PREDICTION_KEY_SET_H_
