// Copyright 2020 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.

#ifndef SRC_UI_SCENIC_LIB_INPUT_INTERNAL_POINTER_EVENT_H_
#define SRC_UI_SCENIC_LIB_INPUT_INTERNAL_POINTER_EVENT_H_

#include <zircon/types.h>

#include <array>

#include "src/ui/lib/glm_workaround/glm_workaround.h"

namespace scenic_impl {
namespace input {

// Possible states the pointer can be in.
// TODO(fxbug.dev/53316): Remove UP and DOWN phases when old input injection API is removed.
enum Phase { kInvalid, kAdd, kDown, kChange, kUp, kRemove, kCancel };

// Extents define an axis-aligned rectangle in 2D space.
struct Extents {
  // Minimum (top left) corner.
  glm::vec2 min = glm::vec2(0);
  // Maximum (bottom right) corner.
  glm::vec2 max = glm::vec2(0);
  Extents() = default;
  Extents(std::array<std::array<float, 2>, 2> extents) {
    min = {extents[0][0], extents[0][1]};
    max = {extents[1][0], extents[1][1]};
  }

  // Used to check for exact equality in TouchSource
  inline bool operator==(const Extents& other) const {
    return min == other.min && max == other.max;
  }
};

// Viewport defines an arbitrary rectangle in the space of the injector context.
// The Viewport is effectively a touchscreen abstraction that can be relayed to clients
// in their local space.
struct Viewport {
  // A rectangle describing the axis-aligned edges of the Viewport in Viewport-local space.
  Extents extents;
  // A transform defining the Viewport in relation to a context (a View).
  glm::mat4 context_from_viewport_transform = glm::mat4(1.f);

  // Used to check for exact equality in TouchSource
  inline bool operator==(const Viewport& other) const {
    return extents == other.extents &&
           context_from_viewport_transform == other.context_from_viewport_transform;
  }
  inline bool operator!=(const Viewport& other) const { return !(*this == other); }
};

// Pointer event representation to be used internally, uncoupled from FIDL types.
struct InternalPointerEvent {
  zx_time_t timestamp = 0;
  // Id of the injection device.
  // TODO(fxbug.dev/53352): This is currently only unique per Injector. Make globally unique.
  uint32_t device_id = 0u;
  // Id of the pointer this event belongs to (== a finger on a touchscreen).
  uint32_t pointer_id = 0u;
  // Current event state.
  Phase phase = Phase::kInvalid;
  // Reference to the context the event was injected from (a View).
  zx_koid_t context = ZX_KOID_INVALID;
  // Reference to the target the event was injected into (a View).
  zx_koid_t target = ZX_KOID_INVALID;
  // The Viewport this event was injected with.
  Viewport viewport;
  // Coordinates in Viewport space. Pointer events do not necessarily need to stay within the
  // Viewport's extents, but are counted as a hit test miss when outside.
  glm::vec2 position_in_viewport = glm::vec2(0, 0);
  // Integer describing mouse buttons. From gfx SessionListener API.
  uint32_t buttons = 0;
};

}  // namespace input
}  // namespace scenic_impl

#endif  // SRC_UI_SCENIC_LIB_INPUT_INTERNAL_POINTER_EVENT_H_
