// 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_FLUTTER_TESTS_INTEGRATION_UTILS_PORTABLE_UI_TEST_H_
#define FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_TESTS_INTEGRATION_UTILS_PORTABLE_UI_TEST_H_

#include <fuchsia/sysmem/cpp/fidl.h>
#include <fuchsia/ui/app/cpp/fidl.h>
#include <fuchsia/ui/input/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/scenic/cpp/fidl.h>
#include <fuchsia/ui/test/input/cpp/fidl.h>
#include <fuchsia/ui/test/scene/cpp/fidl.h>
#include <lib/async-loop/testing/cpp/real_loop.h>
#include <lib/sys/component/cpp/testing/realm_builder.h>
#include <lib/sys/component/cpp/testing/realm_builder_types.h>
#include <zircon/status.h>

#include <optional>
#include <vector>

namespace fuchsia_test_utils {
class PortableUITest : public ::loop_fixture::RealLoop {
 public:
  // The FIDL bindings for these services are not exposed in the Fuchsia SDK so
  // we must encode the names manually here.
  static constexpr auto kVulkanLoaderServiceName =
      "fuchsia.vulkan.loader.Loader";
  static constexpr auto kPosixSocketProviderName =
      "fuchsia.posix.socket.Provider";
  static constexpr auto kPointerInjectorRegistryName =
      "fuchsia.ui.pointerinjector.Registry";

  // The naming and references used by Realm Builder
  static constexpr auto kTestUIStack = "ui";
  static constexpr auto kTestUIStackRef =
      component_testing::ChildRef{kTestUIStack};
  static constexpr auto kFlutterJitRunner = "flutter_jit_runner";
  static constexpr auto kFlutterJitRunnerRef =
      component_testing::ChildRef{kFlutterJitRunner};
  static constexpr auto kFlutterJitRunnerUrl =
      "fuchsia-pkg://fuchsia.com/oot_flutter_jit_runner#meta/"
      "flutter_jit_runner.cm";
  static constexpr auto kFlutterRunnerEnvironment = "flutter_runner_env";

  void SetUp(bool build_realm = true);

  // Calls the Build method for Realm Builder to build the realm
  // Can only be called once, panics otherwise
  void BuildRealm();

  // Attaches a client view to the scene, and waits for it to render.
  void LaunchClient();
  // Attaches a view with an embedded child view to the scene, and waits for it
  // to render.
  void LaunchClientWithEmbeddedView();

  // Returns true when the specified view is fully connected to the scene AND
  // has presented at least one frame of content.
  bool HasViewConnected(zx_koid_t view_ref_koid);

  // Registers a fake touch screen device with an injection coordinate space
  // spanning [-1000, 1000] on both axes.
  void RegisterTouchScreen();

  // Registers a fake mouse device, for which mouse movement is measured on a
  // scale of [-1000, 1000] on both axes and scroll is measured from [-100, 100]
  // on both axes.
  void RegisterMouse();

  // Register a fake keyboard
  void RegisterKeyboard();

  // Simulates a tap at location (x, y).
  void InjectTap(int32_t x, int32_t y);

  // Helper method to simulate combinations of button presses/releases and/or
  // mouse movements.
  void SimulateMouseEvent(
      std::vector<fuchsia::ui::test::input::MouseButton> pressed_buttons,
      int movement_x,
      int movement_y);

  // Helper method to simulate a mouse scroll event.
  //
  // Set `use_physical_units` to true to specify scroll in physical pixels and
  // false to specify scroll in detents.
  void SimulateMouseScroll(
      std::vector<fuchsia::ui::test::input::MouseButton> pressed_buttons,
      int scroll_x,
      int scroll_y,
      bool use_physical_units = false);

  // Helper method to simluate text input
  void SimulateTextEntry(std::string text);

 protected:
  component_testing::RealmBuilder* realm_builder() { return &realm_builder_; }
  component_testing::RealmRoot* realm_root() { return realm_.get(); }

  fuchsia::ui::scenic::ScenicPtr scenic_;
  uint32_t display_width_ = 0;
  uint32_t display_height_ = 0;

  int touch_injection_request_count() const {
    return touch_injection_request_count_;
  }

 private:
  void SetUpRealmBase();

  // Configures the test-specific component topology.
  virtual void ExtendRealm() = 0;

  // Returns the test-specific test-ui-stack component url to use.
  // Usually overridden to return a value from gtest GetParam()
  virtual std::string GetTestUIStackUrl() = 0;

  // Helper method to watch for view geometry updates.
  void WatchViewGeometry();

  // Helper method to process a view geometry update.
  void ProcessViewGeometryResponse(
      fuchsia::ui::observation::geometry::WatchResponse response);

  fuchsia::ui::test::input::RegistryPtr input_registry_;
  fuchsia::ui::test::input::TouchScreenPtr fake_touchscreen_;
  fuchsia::ui::test::input::MousePtr fake_mouse_;
  fuchsia::ui::test::input::KeyboardPtr fake_keyboard_;
  fuchsia::ui::test::scene::ControllerPtr scene_provider_;
  fuchsia::ui::observation::geometry::ViewTreeWatcherPtr view_tree_watcher_;

  component_testing::RealmBuilder realm_builder_ =
      component_testing::RealmBuilder::Create();
  std::unique_ptr<component_testing::RealmRoot> realm_;

  // Counts the number of completed requests to inject touch reports into input
  // pipeline.
  int touch_injection_request_count_ = 0;

  // The KOID of the client root view's `ViewRef`.
  std::optional<zx_koid_t> client_root_view_ref_koid_;

  // Holds the most recent view tree snapshot received from the view tree
  // watcher.
  //
  // From this snapshot, we can retrieve relevant view tree state on demand,
  // e.g. if the client view is rendering content.
  std::optional<fuchsia::ui::observation::geometry::ViewTreeSnapshot>
      last_view_tree_snapshot_;
};

}  // namespace fuchsia_test_utils

#endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_TESTS_INTEGRATION_UTILS_PORTABLE_UI_TEST_H_
