// 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_EMBEDDER_EXAMPLE_VIEW_PROVIDER_SERVICE_H_
#define GARNET_EXAMPLES_UI_EMBEDDER_EXAMPLE_VIEW_PROVIDER_SERVICE_H_

#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/ui/app/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/component/cpp/startup_context.h>
#include <lib/fit/function.h>
#include <lib/ui/scenic/cpp/resources.h>
#include <lib/ui/scenic/cpp/session.h>
#include <lib/zx/eventpair.h>

namespace embedder {

// Parameters for creating a view.
struct ViewContext {
  component::StartupContext* startup_context;
  fuchsia::ui::views::ViewToken token;
  fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> incoming_services;
  fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> outgoing_services;
};

// A callback to create a view in response to a call to
// |ViewProvider.CreateView()|.
using ViewFactory = fit::function<void(ViewContext context)>;

// A basic implementation of the |ViewProvider| interface which Scenic clients
// can use to create and expose custom Views to other Scenic clients.
class ExampleViewProviderService : public fuchsia::ui::app::ViewProvider {
 public:
  ExampleViewProviderService(::component::StartupContext* startup_ctx,
                             ViewFactory factory);
  ~ExampleViewProviderService() override;
  ExampleViewProviderService(const ExampleViewProviderService&) = delete;
  ExampleViewProviderService& operator=(const ExampleViewProviderService&) =
      delete;

  // |fuchsia::ui::app::ViewProvider|
  void CreateView(
      ::zx::eventpair token,
      ::fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
      ::fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
      override;

 private:
  fidl::BindingSet<fuchsia::ui::app::ViewProvider> bindings_;
  ::component::StartupContext* startup_ctx_;
  ViewFactory view_factory_fn_;
};

}  // namespace embedder

#endif  // GARNET_EXAMPLES_UI_EMBEDDER_EXAMPLE_VIEW_PROVIDER_SERVICE_H_
