// 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 LIB_VIRTUALIZATION_SCENIC_WAYLAND_DISPATCHER_H_
#define LIB_VIRTUALIZATION_SCENIC_WAYLAND_DISPATCHER_H_

#include <fuchsia/virtualization/cpp/fidl.h>
#include <fuchsia/wayland/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/zx/channel.h>

namespace guest {

// Provides a |WaylandDispatcher| that will create scenic views for each
// wayland shell surface.
//
// This class is not thread-safe.
class ScenicWaylandDispatcher : public fuchsia::virtualization::WaylandDispatcher {
 public:
  using ViewListener = fit::function<void(fidl::InterfaceHandle<fuchsia::ui::app::ViewProvider>)>;

  ScenicWaylandDispatcher(sys::ComponentContext* context, ViewListener listener = nullptr)
      : context_(context), listener_(std::move(listener)){};

  // |fuchsia::virtualization::WaylandDispatcher|
  void OnNewConnection(zx::channel channel);

  fidl::InterfaceHandle<fuchsia::virtualization::WaylandDispatcher> NewBinding() {
    return bindings_.NewBinding();
  }

 private:
  fuchsia::sys::LauncherPtr ConnectToLauncher() const;

  void OnNewView(fidl::InterfaceHandle<fuchsia::ui::app::ViewProvider> view);
  void Reset(zx_status_t status);

  fuchsia::virtualization::WaylandDispatcher* GetOrStartBridge();

  sys::ComponentContext* context_;

  ViewListener listener_;
  fidl::Binding<fuchsia::virtualization::WaylandDispatcher> bindings_{this};
  fuchsia::sys::ComponentControllerPtr bridge_;
  fuchsia::virtualization::WaylandDispatcherPtr dispatcher_;
  fuchsia::wayland::ViewProducerPtr view_producer_;
};

};  // namespace guest

#endif  // LIB_VIRTUALIZATION_SCENIC_WAYLAND_DISPATCHER_H_
