// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_SYSTEM_WINDOW_INPUT_EVENT_H_
#define COBALT_SYSTEM_WINDOW_INPUT_EVENT_H_

#include <string>

#include "cobalt/base/event.h"
#include "cobalt/math/point_f.h"
#include "starboard/event.h"
#include "starboard/time.h"

namespace cobalt {
namespace system_window {

class InputEvent : public base::Event {
 public:
  enum Type {
    kKeyDown,
    kKeyUp,
    kKeyMove,
    kInput,
    kPointerDown,
    kPointerUp,
    kPointerMove,
    kTouchpadDown,
    kTouchpadUp,
    kTouchpadMove,
    kWheel,
  };

  // Bit-mask of key modifiers. These correspond to the |SbKeyModifiers| values
  // defined in Starboard.
  enum Modifiers {
    kNoModifier = 0,
    kAltKey = 1 << 0,
    kCtrlKey = 1 << 1,
    kMetaKey = 1 << 2,
    kShiftKey = 1 << 3,
    kLeftButton = 1 << 4,
    kRightButton = 1 << 5,
    kMiddleButton = 1 << 6,
    kBackButton = 1 << 7,
    kForwardButton = 1 << 8,
  };

  InputEvent(SbTimeMonotonic timestamp, Type type, int device_id,
             int key_code, uint32 modifiers, bool is_repeat,
             const math::PointF& position = math::PointF(),
             const math::PointF& delta = math::PointF()
#if SB_API_VERSION >= 6
             ,
             float pressure = 0, const math::PointF& size = math::PointF(),
             const math::PointF& tilt = math::PointF()
#endif
#if SB_HAS(ON_SCREEN_KEYBOARD)
             ,
             const std::string& input_text = ""
#endif  // SB_HAS(ON_SCREEN_KEYBOARD)
             )
      : timestamp_(timestamp),
        type_(type),
        device_id_(device_id),
        key_code_(key_code),
        modifiers_(modifiers),
        is_repeat_(is_repeat),
        position_(position),
        delta_(delta)
#if SB_API_VERSION >= 6
        ,
        pressure_(pressure),
        size_(size),
        tilt_(tilt)
#endif
#if SB_HAS(ON_SCREEN_KEYBOARD)
        ,
        input_text_(input_text)
#endif  // SB_HAS(ON_SCREEN_KEYBOARD)
  {
  }

  ~InputEvent() {}

  SbTimeMonotonic timestamp() const { return timestamp_; }
  Type type() const { return type_; }
  int key_code() const { return key_code_; }
  int device_id() const { return device_id_; }
  uint32 modifiers() const { return modifiers_; }
  bool is_repeat() const { return is_repeat_; }
  const math::PointF& position() const { return position_; }
  const math::PointF& delta() const { return delta_; }
#if SB_API_VERSION >= 6
  float pressure() const { return pressure_; }
  const math::PointF& size() const { return size_; }
  const math::PointF& tilt() const { return tilt_; }
#endif
#if SB_HAS(ON_SCREEN_KEYBOARD)
  const std::string& input_text() const { return input_text_; }
#endif  // SB_HAS(ON_SCREEN_KEYBOARD)

  BASE_EVENT_SUBCLASS(InputEvent);

 private:
  SbTimeMonotonic timestamp_;
  Type type_;
  int device_id_;
  int key_code_;
  uint32 modifiers_;
  bool is_repeat_;
  math::PointF position_;
  math::PointF delta_;
#if SB_API_VERSION >= 6
  float pressure_;
  math::PointF size_;
  math::PointF tilt_;
#endif
#if SB_HAS(ON_SCREEN_KEYBOARD)
  std::string input_text_;
#endif  // SB_HAS(ON_SCREEN_KEYBOARD)
};

// The Starboard Event handler SbHandleEvent should call this function on
// unrecognized events. It will extract Input events and dispatch them to the
// appropriate SystemWindow for further routing.
void HandleInputEvent(const SbEvent* event);

}  // namespace system_window
}  // namespace cobalt

#endif  // COBALT_SYSTEM_WINDOW_INPUT_EVENT_H_
