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

#include <fuchsia/boot/c/fidl.h>
#include <fuchsia/ldsvc/llcpp/fidl.h>
#include <lib/boot-args/boot-args.h>
#include <lib/fdio/namespace.h>
#include <lib/zx/vmo.h>

#include "coordinator.h"
#include "fdio.h"

constexpr char kItemsPath[] = "/svc/" fuchsia_boot_Items_Name;

zx_status_t wait_for_file(const char* path, zx::time deadline);

class SystemInstance : public devmgr::FsProvider {
 public:
  struct ServiceStarterArgs {
    SystemInstance* instance;
    devmgr::Coordinator* coordinator;
  };

  SystemInstance();

  // Implementation required to implement devmgr::FsProvider
  zx::channel CloneFs(const char* path) override;

  // The heart of the public API, in the order that things get called during
  // startup.
  zx_status_t CreateSvcJob(const zx::job& root_job);
  zx_status_t CreateFuchsiaJob(const zx::job& root_job);
  zx_status_t PrepareChannels();

  zx_status_t StartSvchost(const zx::job& root_job, bool require_system,
                           devmgr::Coordinator* coordinator, zx::channel fshost_client);
  zx_status_t ReuseExistingSvchost();

  void devmgr_vfs_init(devmgr::Coordinator* coordinator, const devmgr::DevmgrArgs& devmgr_args,
                       zx::channel fshost_server);
  // Thread entry point
  static int pwrbtn_monitor_starter(void* arg);
  int PwrbtnMonitorStarter(devmgr::Coordinator* coordinator);

  void start_console_shell(const devmgr::BootArgs& boot_args);
  int ConsoleStarter(const devmgr::BootArgs* arg);

  // Thread entry point
  static int service_starter(void* arg);
  int ServiceStarter(devmgr::Coordinator* coordinator);
  int FuchsiaStarter(devmgr::Coordinator* coordinator);

  // TODO(ZX-4860): DEPRECATED. Do not add new dependencies on the fshost loader service!
  zx_status_t clone_fshost_ldsvc(zx::channel* loader);

 protected:
  // Protected constructor for SystemInstance that allows injecting a different
  // namespace, primarily for use in unit tests.
  explicit SystemInstance(fdio_ns_t* default_ns);

 private:
  // Private helper functions.
  void do_autorun(const char* name, const char* cmd, const zx::resource& root_resource);
  zx::channel fshost_start(devmgr::Coordinator* coordinator, const devmgr::DevmgrArgs& devmgr_args);

  // The handle used to transmit messages to appmgr.
  zx::channel appmgr_client_;

  // The handle used by appmgr to serve incoming requests.
  // If appmgr cannot be launched within a timeout, this handle is closed.
  zx::channel appmgr_server_;

  // The handle used to transmit messages to miscsvc.
  zx::channel miscsvc_client_;

  // The handle used by miscsvc to serve incoming requests.
  zx::channel miscsvc_server_;

  // The handle used to transmit messages to device_name_provider.
  zx::channel device_name_provider_client_;

  // The handle used by device_name_provider to serve incoming requests.
  zx::channel device_name_provider_server_;

  // The outgoing (exposed) connection to the svchost.
  zx::channel svchost_outgoing_;

  // The job in which we run "svc" realm services, like svchost, fshost,
  // miscsvc, netsvc, the consoles, autorun, and others.
  zx::job svc_job_;

  // The job in which we run appmgr.
  zx::job fuchsia_job_;

  // Used to bind the svchost to the virtual-console binary to provide fidl
  // services.
  zx::channel virtcon_fidl_;

  // The namespace into which SystemInstance::CloneFs will send open requests
  // for directories hosted by fshost. Defaults to the results of
  // fdio_ns_get_installed during construction, but can be overridden for test
  // cases.
  fdio_ns_t* default_ns_;

  devmgr::DevmgrLauncher launcher_;
};

#endif  // SRC_DEVICES_COORDINATOR_SYSTEM_INSTANCE_H_
