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

#include <fuchsia/modular/session/cpp/fidl.h>
#include <fuchsia/ui/gfx/cpp/fidl.h>
#include <fuchsia/ui/input/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <src/lib/fxl/macros.h>

namespace modular {

// This class holds the presentation service.
class PresentationContainer : fuchsia::ui::policy::KeyboardCaptureListenerHACK {
 public:
  // Initializes the presentation with the given |view_owner| and
  // |shell_config| and connects it to the presenter service. Attaches
  // the given |on_swap_session_shell| to a reserved keyboard binding
  // (this is a hack to keep SwapSessionShell working).
  explicit PresentationContainer(fuchsia::ui::policy::Presenter* const presenter,
                                 fuchsia::ui::views::ViewHolderToken view_holder_token,
                                 fuchsia::modular::session::SessionShellConfig shell_config,
                                 fit::function<void()> on_swap_session_shell);

  ~PresentationContainer() override;

  // Connects the given |request| to the presentation service. NOTE that the
  // presentation needs to be connected to the presenter service in order for
  // this presentation to display on UI.
  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request);

 private:
  // Adds global keyboard shortcuts, including a reserved keyboard binding.
  void AddGlobalKeyboardShortcuts(fuchsia::ui::policy::PresentationPtr& presentation);

  // |fuchsia::ui::policy::KeyboardCaptureListenerHACK|
  void OnEvent(fuchsia::ui::input::KeyboardEvent event) override;

  void SetNextShadowTechnique();

  void SetShadowTechnique(fuchsia::ui::gfx::ShadowTechnique shadow_technique);

  void ToggleClipping();

  // Used to initialize the presentation. Not owned.
  fuchsia::ui::policy::Presenter* const presenter_;

  // Bindings for global keyboard shortcuts. See |AddGlobalKeyboardShortcuts|.
  fidl::BindingSet<fuchsia::ui::policy::KeyboardCaptureListenerHACK>
      keyboard_capture_listener_bindings_;
  // Callback invoked when keyboard binding for swapping session shells is
  // observed.
  fit::function<void()> on_swap_session_shell_;

  struct {
    // Presentation service, which is binded to the |presenter_| on
    // initialization.
    fuchsia::ui::policy::PresentationPtr presentation;
    // Bindings to the presentation service, which is binded to the client on
    // |GetPresentation|.
    fidl::BindingSet<fuchsia::ui::policy::Presentation> bindings;

    // Scenic demos for toggling a presentation's shadow technique and clipping.
    fuchsia::ui::gfx::ShadowTechnique shadow_technique =
        fuchsia::ui::gfx::ShadowTechnique::UNSHADOWED;
    bool clipping_enabled{};
  } presentation_state_;

  FXL_DISALLOW_COPY_AND_ASSIGN(PresentationContainer);
};

}  // namespace modular

#endif  // PERIDOT_BIN_BASEMGR_PRESENTATION_CONTAINER_H_
