// Copyright 2019 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_TESTING_VIEWS_EMBEDDER_VIEW_H_
#define GARNET_TESTING_VIEWS_EMBEDDER_VIEW_H_

#include <fuchsia/ui/scenic/cpp/fidl.h>
#include <lib/ui/base_view/cpp/base_view.h>
#include <lib/ui/scenic/cpp/resources.h>
#include <lib/ui/scenic/cpp/session.h>

namespace scenic {

// This is a simplified |BaseView| that exposes view state events.
//
// See also lib/ui/base_view.
class EmbedderView : public fuchsia::ui::scenic::SessionListener {
 public:
  EmbedderView(ViewContext context,
               const std::string& debug_name = "EmbedderView");

  // Sets the EmbeddedViewInfo and attaches the embedded View to the scene. Any
  // callbacks for the embedded View's ViewState are delivered to the supplied
  // callback.
  void EmbedView(EmbeddedViewInfo info,
                 std::function<void(fuchsia::ui::gfx::ViewState)> callback);

 private:
  // |fuchsia::ui::scenic::SessionListener|
  void OnScenicEvent(std::vector<fuchsia::ui::scenic::Event> events) override;
  // |fuchsia::ui::scenic::SessionListener|
  void OnScenicError(std::string error) override;

  struct EmbeddedView {
    EmbeddedView(
        EmbeddedViewInfo info, Session* session,
        std::function<void(fuchsia::ui::gfx::ViewState)> view_state_callback,
        const std::string& debug_name = "EmbedderView");

    EmbeddedViewInfo embedded_info;
    ViewHolder view_holder;
    std::function<void(fuchsia::ui::gfx::ViewState)>
        view_state_changed_callback;
  };

  fidl::Binding<fuchsia::ui::scenic::SessionListener> binding_;
  Session session_;
  View view_;
  EntityNode top_node_;
  std::optional<fuchsia::ui::gfx::ViewProperties> embedded_view_properties_;
  std::unique_ptr<EmbeddedView> embedded_view_;
};

}  // namespace scenic
#endif  // GARNET_TESTING_VIEWS_EMBEDDER_VIEW_H_
