// 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_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_

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

#include <fbl/span.h>
#include <fs/pseudo_dir.h>
#include <fs/synchronous_vfs.h>

#include "coordinator.h"
#include "fdio.h"
#include "fuchsia/boot/llcpp/fidl.h"

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

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

// Host's a vfs which forwards a subset of requests to a channel.
class DirectoryFilter {
 public:
  DirectoryFilter(async_dispatcher_t* dispatcher)
      : root_dir_(fbl::MakeRefCounted<fs::PseudoDir>()), vfs_(dispatcher) {}

  zx_status_t Initialize(zx::channel forwarding_dir, fbl::Span<const char*> allow_filter);

  zx_status_t Serve(zx::channel request) {
    return vfs_.ServeDirectory(root_dir_, std::move(request));
  }

 private:
  zx::channel forwarding_dir_;
  fbl::RefPtr<fs::PseudoDir> root_dir_;
  fs::SynchronousVfs vfs_;
};

class SystemInstance : public FsProvider {
 public:
  SystemInstance();
  ~SystemInstance() { loop_.Shutdown(); }

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

  zx_status_t CreateDriverHostJob(const zx::job& root_job, zx::job* driver_host_job_out);
  void InstallDevFsIntoNamespace();

  void ServiceStarter(Coordinator* coordinator);
  int WaitForSystemAvailable(Coordinator* coordinator);

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

 protected:
  DevmgrLauncher& launcher() { return launcher_; }

 private:
  zx_status_t InitializeDriverHostSvcDir();

  DevmgrLauncher launcher_;

  // Hosts vfs which filters driver host svc requests to /svc provided by svchost.
  // Lazily initialized.
  std::optional<DirectoryFilter> driver_host_svc_;
  async::Loop loop_{&kAsyncLoopConfigNeverAttachToThread};
};

#endif  // SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_
