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

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/string.h>

namespace modular {

class StoryControllerImpl;
class StoryProviderImpl;

class StoryShellContextImpl : fuchsia::modular::StoryShellContext {
 public:
  StoryShellContextImpl(fidl::StringPtr story_id,
                        StoryProviderImpl* story_provider_impl,
                        StoryControllerImpl* story_controller_impl);
  ~StoryShellContextImpl() override;

  void Connect(
      fidl::InterfaceRequest<fuchsia::modular::StoryShellContext> request);

 private:
  // |fuchsia::modular::StoryShellContext|
  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
                           request) override;
  void WatchVisualState(
      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher)
      override;
  void GetLink(fidl::InterfaceRequest<fuchsia::modular::Link> request) override;
  void RequestView(fidl::StringPtr surface_id) override;
  void OnSurfaceOffScreen(fidl::StringPtr surface_id) override;

  const fidl::StringPtr story_id_;
  // Not owned. The StoryProviderImpl corresponding to this context.
  StoryProviderImpl* const story_provider_impl_;
  // Not owned. The StoryControllerImpl for the Story corresponding to this
  // context.
  StoryControllerImpl* const story_controller_impl_;

  fidl::BindingSet<fuchsia::modular::StoryShellContext> bindings_;
};
}  // namespace modular

#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_SHELL_CONTEXT_IMPL_H_
