// Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_FUCHSIA_POINTER_INJECTOR_DELEGATE_H_
#define FLUTTER_SHELL_PLATFORM_FUCHSIA_POINTER_INJECTOR_DELEGATE_H_

#include <fuchsia/ui/pointerinjector/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>

#include <queue>
#include <unordered_map>
#include <vector>

#include "flutter/fml/macros.h"
#include "flutter/fml/memory/weak_ptr.h"
#include "flutter/lib/ui/window/platform_message.h"
#include "third_party/rapidjson/include/rapidjson/document.h"

namespace flutter_runner {

// This class is responsible for handling the platform messages related to
// pointer events and managing the lifecycle of
// |fuchsia.ui.pointerinjector.Device| client side endpoint for embedded views.
class PointerInjectorDelegate {
 public:
  static constexpr auto kPointerInjectorMethodPrefix =
      "View.pointerinjector.inject";

  PointerInjectorDelegate(fuchsia::ui::pointerinjector::RegistryHandle registry,
                          fuchsia::ui::views::ViewRef host_view_ref,
                          bool is_flatland)
      : registry_(std::make_shared<fuchsia::ui::pointerinjector::RegistryPtr>(
            registry.Bind())),
        host_view_ref_(std::make_shared<fuchsia::ui::views::ViewRef>(
            std::move(host_view_ref))),
        is_flatland_(is_flatland) {}

  // Handles the following pointer event related platform message requests:
  // View.Pointerinjector.inject
  //  - Attempts to dispatch a pointer event to the given viewRef. Completes
  //    with [0] when the pointer event is sent to the given viewRef.
  bool HandlePlatformMessage(
      rapidjson::Value request,
      fml::RefPtr<flutter::PlatformMessageResponse> response);

  // Adds an endpoint for |view_id| in |valid_views_| for lifecycle management.
  // Called in |GFXPlatformView::OnCreateView()| and
  // |FlatlandPlatformView::OnChildViewViewRef()|.
  void OnCreateView(
      uint64_t view_id,
      std::optional<fuchsia::ui::views::ViewRef> view_ref = std::nullopt);

  // Closes the |fuchsia.ui.pointerinjector.Device| channel for |view_id| and
  // cleans up resources.
  void OnDestroyView(uint64_t view_id) { valid_views_.erase(view_id); };

 private:
  using ViewId = int64_t;

  struct PointerInjectorRequest {
    // The position of the pointer event in viewport's coordinate system.
    float x = 0.f, y = 0.f;

    // |fuchsia.ui.pointerinjector.PointerSample.pointer_id|.
    uint32_t pointer_id = 0;

    // |fuchsia.ui.pointerinjector.PointerSample.phase|.
    fuchsia::ui::pointerinjector::EventPhase phase =
        fuchsia::ui::pointerinjector::EventPhase::ADD;

    // |fuchsia.ui.pointerinjector.Event.trace_flow_id|.
    uint64_t trace_flow_id = 0;

    // The view for which dispatch is attempted for the pointer event. For
    // flatland views, this value is set as std::nullopt.
    std::optional<fuchsia::ui::views::ViewRef> view_ref;

    // Logical size of the view's coordinate system.
    std::array<float, 2> logical_size = {0.f, 0.f};

    // |fuchsia.ui.pointerinjector.Event.timestamp|.
    zx_time_t timestamp = 0;
  };

  // This class is responsible for dispatching pointer events to a view by first
  // registering the injector device using
  // |fuchsia.ui.pointerinjector.Registry.Register| and then injecting the
  // pointer event using |fuchsia.ui.pointerinjector.Device.Inject|.
  class PointerInjectorEndpoint {
   public:
    PointerInjectorEndpoint(
        std::shared_ptr<fuchsia::ui::pointerinjector::RegistryPtr> registry,
        std::shared_ptr<fuchsia::ui::views::ViewRef> host_view_ref,
        std::optional<fuchsia::ui::views::ViewRef> view_ref)
        : registry_(std::move(registry)),
          host_view_ref_(std::move(host_view_ref)),
          view_ref_(std::move(view_ref)),
          weak_factory_(this) {
      // Try to re-register the |device_| if the |device_| gets closed due to
      // some error.
      device_.set_error_handler(
          [weak = weak_factory_.GetWeakPtr()](auto status) {
            FML_LOG(WARNING)
                << "fuchsia.ui.pointerinjector.Device closed " << status;
            if (!weak) {
              return;
            }

            // Clear all the stale pointer events in |injector_events_| and
            // reset the state of |weak| so that any future calls do not inject
            // any stale pointer events.
            weak->Reset();
          });
    }

    // Registers |device_| if it has not been registered and calls
    // |DispatchPendingEvents()| to dispatch |request| to the view.
    void InjectEvent(PointerInjectorRequest request);

   private:
    // Registers with the pointer injector service.
    //
    // Sets |registered_| to true immediately after submitting the registration
    // request. This means that the registration request may still be in-flight
    // on the server side when the function returns. Events can safely be
    // injected into the channel while registration is pending ("feed forward").
    void RegisterInjector(const PointerInjectorRequest& request);

    // Recursively calls |fuchsia.ui.pointerinjector.Device.Inject| to dispatch
    // the pointer events in |injector_events_| to the view.
    void DispatchPendingEvents();

    void EnqueueEvent(fuchsia::ui::pointerinjector::Event event);

    // Resets |registered_|, |injection_in_flight_| and |injector_events_| so
    // that |device_| can be re-registered and future calls to
    // |fuchsia.ui.pointerinjector.Device.Inject| do not include any stale
    // pointer events.
    void Reset();

    // Set to true if there is a |fuchsia.ui.pointerinjector.Device.Inject| call
    // in progress. If true, the |fuchsia.ui.pointerinjector.Event| is buffered
    // in |injector_events_|.
    bool injection_in_flight_ = false;

    // Set to true if |device_| has been registered using
    // |fuchsia.ui.pointerinjector.Registry.Register|. False otherwise.
    bool registered_ = false;

    std::shared_ptr<fuchsia::ui::pointerinjector::RegistryPtr> registry_;

    // ViewRef for the main flutter app launching the embedded child views.
    std::shared_ptr<fuchsia::ui::views::ViewRef> host_view_ref_;

    // ViewRef for a flatland view. For GFX this value is set as std::nullopt.
    // Set in |OnCreateView|.
    std::optional<fuchsia::ui::views::ViewRef> view_ref_;

    fuchsia::ui::pointerinjector::DevicePtr device_;

    // A queue containing all the pending |fuchsia.ui.pointerinjector.Event|s
    // which have to be dispatched to the view.
    // Note: The size of a vector inside |injector_events_| should not exceed
    // |fuchsia.ui.pointerinjector.MAX_INJECT|.
    std::queue<std::vector<fuchsia::ui::pointerinjector::Event>>
        injector_events_;

    fml::WeakPtrFactory<PointerInjectorEndpoint>
        weak_factory_;  // Must be the last member.

    FML_DISALLOW_COPY_AND_ASSIGN(PointerInjectorEndpoint);
  };

  void Complete(fml::RefPtr<flutter::PlatformMessageResponse> response,
                std::string value);

  // Generates a |fuchsia.ui.pointerinjector.Event| from |request| by extracting
  // information like timestamp, trace flow id and pointer sample from
  // |request|.
  static fuchsia::ui::pointerinjector::Event ExtractPointerEvent(
      PointerInjectorRequest request);

  // A map of valid views keyed by its view id. A view can receive pointer
  // events only if it is present in |valid_views_|.
  std::unordered_map<ViewId, PointerInjectorEndpoint> valid_views_;

  std::shared_ptr<fuchsia::ui::pointerinjector::RegistryPtr> registry_;

  // ViewRef for the main flutter app launching the embedded child views.
  std::shared_ptr<fuchsia::ui::views::ViewRef> host_view_ref_;

  bool is_flatland_ = false;

  FML_DISALLOW_COPY_AND_ASSIGN(PointerInjectorDelegate);
};

}  // namespace flutter_runner
#endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_POINTER_INJECTOR_DELEGATE_H_
