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

#include <fuchsia/boot/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>

#include <memory>
#include <string>

#include <fbl/unique_fd.h>
#include <sdk/lib/sys/cpp/component_context.h>
#include <src/connectivity/network/testing/netemul/lib/network/network_context.h>
#include <src/connectivity/network/testing/netemul/lib/sync/sync_manager.h>

#include "src/lib/fxl/macros.h"

namespace netemul {

class ServiceHolder;
class ManagedEnvironment;

class SandboxEnv {
 public:
  using Ptr = std::shared_ptr<SandboxEnv>;
  class Events {
   public:
    Events() = default;
    Events(Events&& other) = default;

   public:
    fit::function<void(const std::string&, int64_t, fuchsia::sys::TerminationReason)>
        service_terminated;

    fit::function<void()> devfs_terminated;
    fit::function<void()> network_tun_terminated;

    FXL_DISALLOW_COPY_AND_ASSIGN(Events);
  };

  // Creates a sandbox environment
  SandboxEnv(std::shared_ptr<sys::ServiceDirectory> env_services, Events events = Events());
  ~SandboxEnv();

  const std::string& default_name() const { return default_name_; }
  void set_default_name(std::string default_name) { default_name_ = std::move(default_name); }

  void set_devfs_enabled(bool enabled);

  const Events& events() const { return events_; }

  NetworkContext& network_context() { return net_context_; }
  SyncManager& sync_manager() { return sync_manager_; }

  std::weak_ptr<ManagedEnvironment> guest_env_;

  void ConnectNetworkTun(fidl::InterfaceRequest<fuchsia::net::tun::Control> req);
  void ConnectToReadOnlyLog(fidl::InterfaceRequest<fuchsia::boot::ReadOnlyLog> req);

 private:
  void ConnectDevfs(zx::channel req);
  std::string default_name_;
  std::shared_ptr<sys::ServiceDirectory> env_services_;
  std::unique_ptr<ServiceHolder> devfs_;
  std::unique_ptr<ServiceHolder> network_tun_;
  Events events_;
  NetworkContext net_context_;
  SyncManager sync_manager_;

  FXL_DISALLOW_COPY_AND_ASSIGN(SandboxEnv);
};
}  // namespace netemul

#endif  // SRC_CONNECTIVITY_NETWORK_TESTING_NETEMUL_RUNNER_SANDBOX_ENV_H_
