// 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_SYS_TEST_RUNNERS_LEGACY_TEST_RUNNER_H_
#define SRC_SYS_TEST_RUNNERS_LEGACY_TEST_RUNNER_H_

#include <fuchsia/component/runner/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/fpromise/result.h>
#include <lib/sys/cpp/service_directory.h>

#include <map>
#include <memory>

#include "test_component.h"

using ComponentRunner = fuchsia::component::runner::ComponentRunner;

/// Implement Runner protocol and launch wrapped legacy test components.
class Runner final : public ComponentRunner {
 public:
  explicit Runner(std::shared_ptr<sys::ServiceDirectory> svc, async_dispatcher_t* dispatcher);
  ~Runner() override;

  void Start(fuchsia::component::runner::ComponentStartInfo start_info,
             fidl::InterfaceRequest<::fuchsia::component::runner::ComponentController> controller)
      override;

  fidl::InterfaceRequestHandler<ComponentRunner> GetHandler() {
    return bindings_.GetHandler(this, dispatcher_);
  }

  void AddBinding(zx::channel request) {
    bindings_.AddBinding(this, fidl::InterfaceRequest<ComponentRunner>(std::move(request)),
                         dispatcher_);
  }

 private:
  std::shared_ptr<sys::ServiceDirectory> svc_;
  std::map<TestComponent*, std::unique_ptr<TestComponent>> test_components_;
  fidl::BindingSet<ComponentRunner> bindings_;
  async_dispatcher_t* dispatcher_;
};

#endif  // SRC_SYS_TEST_RUNNERS_LEGACY_TEST_RUNNER_H_
