// Copyright 2022 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_TESTS_LIB_VIEW_PROVIDER_SERVER_H_
#define SRC_UI_TESTS_LIB_VIEW_PROVIDER_SERVER_H_

#include <fuchsia/ui/app/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/sys/component/cpp/testing/realm_builder.h>
#include <lib/sys/component/cpp/testing/realm_builder_types.h>
#include <zircon/types.h>

#include <memory>
#include <vector>

// This is an in-process server for the `fuchsia.ui.app.ViewProvider` API for this
// test.  It is required for this test to be able to define and set up its view
// as the root view in Scenic's scene graph.  The implementation does little more
// than to provide correct wiring of the FIDL API.  The test that uses it is
// expected to provide a closure via SetCreateView2Callback, which will get invoked
// when a message is received.
//
// Only Flatland methods are implemented, others will cause the server to crash
// the test deliberately.
class ViewProviderServer : public fuchsia::ui::app::ViewProvider,
                           public component_testing::LocalComponent {
 public:
  explicit ViewProviderServer(async_dispatcher_t* dispatcher);

  // Start serving `ViewProvider` for the stream that arrives via `request`.
  void Bind(fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> request);
  // Set this callback to direct where an incoming message from `CreateView2` will
  // get forwarded to.
  void SetCreateView2Callback(std::function<void(fuchsia::ui::app::CreateView2Args)> callback);

  // LocalComponent::Start
  void Start(std::unique_ptr<component_testing::LocalComponentHandles> local_handles) override;

  // Gfx protocol is not implemented.
  void CreateView(
      ::zx::eventpair token,
      ::fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
      ::fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) override;

  // Gfx protocol is not implemented.
  void CreateViewWithViewRef(zx::eventpair token,
                             fuchsia::ui::views::ViewRefControl view_ref_control,
                             fuchsia::ui::views::ViewRef view_ref) override;

  // Implements server-side `fuchsia.ui.app.ViewProvider/CreateView2`
  void CreateView2(fuchsia::ui::app::CreateView2Args args) override;

 private:
  async_dispatcher_t* dispatcher_ = nullptr;
  std::vector<std::unique_ptr<component_testing::LocalComponentHandles>> local_handles_;
  fidl::BindingSet<fuchsia::ui::app::ViewProvider> bindings_;

  std::function<void(fuchsia::ui::app::CreateView2Args)> create_view2_callback_ = nullptr;
};

#endif  // SRC_UI_TESTS_LIB_VIEW_PROVIDER_SERVER_H_
