// Copyright 2018 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 GARNET_EXAMPLES_UI_HELLO_INPUT_APP_H_
#define GARNET_EXAMPLES_UI_HELLO_INPUT_APP_H_

#include <array>
#include <memory>

#include <fuchsia/ui/app/cpp/fidl.h>
#include <fuchsia/ui/input/cpp/fidl.h>
#include <fuchsia/ui/scenic/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <zx/eventpair.h>

#include "garnet/bin/ui/input_reader/input_reader.h"
#include "lib/component/cpp/startup_context.h"
#include "lib/fidl/cpp/binding_set.h"
#include "lib/ui/input/device_state.h"
#include "lib/ui/input/input_device_impl.h"
#include "lib/ui/scenic/cpp/resources.h"
#include "lib/ui/scenic/cpp/session.h"

namespace examples_ui_hello_input {

// The hello_input application is a standalone application that exercises
// Scenic's input subsystem. To run it:
// $ run hello_input [--verbose=1]
//
// The README.md file describes its operation.
class App : public fuchsia::ui::input::InputDeviceRegistry,
            public mozart::InputDeviceImpl::Listener {
 public:
  App(async::Loop* loop);
  ~App();

  // |fuchsia::ui::input::InputDeviceRegistry|
  void RegisterDevice(fuchsia::ui::input::DeviceDescriptor descriptor,
                      fidl::InterfaceRequest<fuchsia::ui::input::InputDevice>
                          input_device) override;

  // |mozart::InputDeviceImpl::Listener|
  void OnDeviceDisconnected(mozart::InputDeviceImpl* input_device) override;

  // |mozart::InputDeviceImpl::Listener|
  void OnReport(mozart::InputDeviceImpl* input_device,
                fuchsia::ui::input::InputReport report) override;

 private:
  const static std::size_t kMaxFingers = 10;

  // Not copyable or movable.
  App(const App&) = delete;
  App& operator=(const App&) = delete;

  void UpdateScene(uint64_t next_presentation_time);
  void CreateScene(float display_width, float display_height);
  void ReleaseSessionResources();

  // Press ESC to quit.
  void CheckQuit(const fuchsia::ui::input::InputEvent& event);

  // Callbacks
  void OnScenicError();
  void OnSessionError();
  void OnSessionClose();
  // Deal with Events from Scenic.
  void OnSessionEvents(std::vector<fuchsia::ui::scenic::Event> events);
  // Display a focus frame around the View.
  void OnFocusEvent(const fuchsia::ui::input::FocusEvent& event);
  // Blink the focus frame.
  void OnKeyboardEvent(const fuchsia::ui::input::KeyboardEvent& event);
  // Display a finger tracker for each finger captured by this View.
  void OnPointerEvent(const fuchsia::ui::input::PointerEvent& event);
  // Deal with sensor reports received from Zircon.
  void OnDeviceSensorEvent(uint32_t device_id,
                           fuchsia::ui::input::InputReport event);
  // Route input events from Zircon to Scenic.
  void OnDeviceInputEvent(uint32_t compositor_id,
                          fuchsia::ui::input::InputEvent event);

  // Application fields
  std::unique_ptr<component::StartupContext> startup_context_;
  async::Loop* const message_loop_;

  // Input fields
  mozart::InputReader input_reader_;
  fidl::BindingSet<fuchsia::ui::input::InputDeviceRegistry>
      input_device_registry_bindings_;
  uint32_t next_device_token_;
  std::unordered_map<uint32_t, std::unique_ptr<mozart::InputDeviceImpl>>
      device_by_id_;
  std::unordered_map<uint32_t, std::unique_ptr<mozart::DeviceState>>
      device_state_by_id_;

  // HelloInput's Scene
  fuchsia::ui::scenic::ScenicPtr scenic_;
  std::unique_ptr<scenic::Session> session_;
  std::unique_ptr<scenic::DisplayCompositor> compositor_;
  std::unique_ptr<scenic::Camera> camera_;
  std::unique_ptr<scenic::EntityNode> focus_frame_;
  std::array<std::unique_ptr<scenic::ShapeNode>, kMaxFingers> pointer_tracker_;
  std::array<uint32_t, kMaxFingers> pointer_id_;  // Pointer id for each shape.
  float width_in_px_;
  float height_in_px_;
  bool focused_;

  // HelloInput's View
  std::unique_ptr<scenic::ViewHolder> view_holder_;
  std::unique_ptr<scenic::View> view_;

  // Child component fields
  fuchsia::sys::ComponentControllerPtr child_controller_;
  fuchsia::ui::app::ViewProviderPtr child_view_provider_;
  std::unique_ptr<scenic::ViewHolder> child_view_holder_;
};

}  // namespace examples_ui_hello_input

#endif  // GARNET_EXAMPLES_UI_HELLO_INPUT_APP_H_
