// Copyright 2016 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_SESSION_CONTEXT_IMPL_H_
#define PERIDOT_BIN_BASEMGR_SESSION_CONTEXT_IMPL_H_

#include <fuchsia/auth/cpp/fidl.h>
#include <fuchsia/modular/auth/cpp/fidl.h>
#include <fuchsia/modular/cpp/fidl.h>
#include <fuchsia/modular/internal/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/async/cpp/future.h>
#include <lib/component/cpp/startup_context.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/interface_handle.h>
#include <lib/fidl/cpp/interface_ptr_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/fit/function.h>
#include <src/lib/fxl/macros.h>

#include "peridot/lib/fidl/app_client.h"
#include "peridot/lib/fidl/environment.h"

namespace modular {

// |SessionContextImpl| starts and manages a Sessionmgr. The life time of a
// Sessionmgr is bound to this class. |SessionContextImpl| is not self-owned,
// but still drives its own deletion: On logout, it signals its
// owner (BasemgrImpl) to delete it.
class SessionContextImpl : fuchsia::modular::internal::SessionContext {
 public:
  // Called after perfoming shutdown of the session, to signal our completion
  // (and deletion of our instance) to our owner, this is done using a callback
  // supplied in the constructor. (The alternative is to take in a
  // SessionProvider*, which seems a little specific and overscoped).
  using OnSessionShutdownCallback = fit::function<void(bool logout_users)>;

  // Called when sessionmgr requests to acquire the presentation.
  using GetPresentationCallback = fit::function<void(
      fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request)>;

  // |session_id| is the device-local unique identifier for this session. Caller
  // must ensure its uniqueness. sessionmgr creates an Environment namespace
  // with the given |session_id|, and this will crash if it tries to create an
  // environment with a pre-existing name.
  SessionContextImpl(
      fuchsia::sys::Launcher* const launcher, std::string session_id,
      fuchsia::modular::AppConfig sessionmgr_config,
      fuchsia::modular::AppConfig session_shell_config,
      fuchsia::modular::AppConfig story_shell_config,
      bool use_session_shell_for_story_shell_factory,
      fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
      fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
      fuchsia::modular::auth::AccountPtr account,
      fuchsia::ui::views::ViewToken view_token,
      GetPresentationCallback get_presentation,
      OnSessionShutdownCallback on_session_shutdown);

  // This will effectively tear down the entire instance by calling
  // |on_session_shutdown_|. If |logout_users| is true, all the users will be
  // logged out with the assumption that all users belong to the current
  // session.
  void Shutdown(bool logout_users, fit::function<void()> callback);

  // Stops the active session shell, and starts the session shell specified in
  // |session_shell_config|.
  FuturePtr<> SwapSessionShell(
      fuchsia::modular::AppConfig session_shell_config);

 private:
  // Determines where current configurations are being read from, and forwards
  // that directory into a flat namespace that will be added to sessionmgr's
  // launch info.
  fuchsia::sys::FlatNamespacePtr MakeConfigNamespace();

  // |fuchsia::modular::internal::SessionContext|
  void Logout() override;

  // |fuchsia::modular::internal::SessionContext|
  void Shutdown() override;

  // |fuchsia::modular::internal::SessionContext|
  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
                           request) override;

  std::unique_ptr<Environment> sessionmgr_environment_;
  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> sessionmgr_app_;
  fuchsia::modular::internal::SessionmgrPtr sessionmgr_;

  fidl::Binding<fuchsia::modular::internal::SessionContext>
      session_context_binding_;

  std::vector<fit::function<void()>> shutdown_callbacks_;

  GetPresentationCallback get_presentation_;
  OnSessionShutdownCallback on_session_shutdown_;

  FXL_DISALLOW_COPY_AND_ASSIGN(SessionContextImpl);
};

}  // namespace modular

#endif  // PERIDOT_BIN_BASEMGR_SESSION_CONTEXT_IMPL_H_
