// Copyright 2021 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_GRAPHICS_BIN_VULKAN_LOADER_ICD_RUNNER_H_
#define SRC_GRAPHICS_BIN_VULKAN_LOADER_ICD_RUNNER_H_

#include <fidl/fuchsia.component.runner/cpp/fidl.h>
#include <lib/component/outgoing/cpp/outgoing_directory.h>

#include "src/storage/lib/vfs/cpp/synchronous_vfs.h"

class ComponentControllerImpl : public fidl::Server<fuchsia_component_runner::ComponentController> {
 public:
  // Binds `controller` to a new component controller using the given `outgoing_dir` and
  // `pkg_directory`. On error, `controller` will be closed with an epitaph.
  static zx::result<std::unique_ptr<fidl::Server<fuchsia_component_runner::ComponentController>>>
  Bind(async_dispatcher_t* dispatcher,
       fidl::ServerEnd<fuchsia_component_runner::ComponentController> controller,
       fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir,
       fidl::ClientEnd<fuchsia_io::Directory> pkg_directory);

 private:
  explicit ComponentControllerImpl(async_dispatcher_t* dispatcher);
  void Stop(StopCompleter::Sync& completer) override { binding_->Close(ZX_OK); }
  void Kill(KillCompleter::Sync& completer) override { binding_->Close(ZX_OK); }

  fs::SynchronousVfs vfs_;
  std::optional<fidl::ServerBindingRef<fuchsia_component_runner::ComponentController>> binding_;
};

// This implements the icd_runner interface.
class IcdRunnerImpl : public fidl::Server<fuchsia_component_runner::ComponentRunner> {
 public:
  explicit IcdRunnerImpl(async_dispatcher_t* dispatcher) : dispatcher_(dispatcher) {}
  static zx::result<> Add(std::unique_ptr<IcdRunnerImpl> component_runner,
                          component::OutgoingDirectory& outgoing);

  void Start(StartRequest& request, StartCompleter::Sync& completer) override;

 private:
  async_dispatcher_t* const dispatcher_;
  std::unique_ptr<fidl::Server<fuchsia_component_runner::ComponentController>> controller_server_;
};

#endif  // SRC_GRAPHICS_BIN_VULKAN_LOADER_ICD_RUNNER_H_
