// 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.

#include "src/example_driver/example_driver.h"

#include <fidl/fuchsia.driver.compat/cpp/wire.h>

namespace fdf {
using namespace fuchsia_driver_framework;
}  // namespace fdf

namespace example_driver {

namespace {
namespace fio = fuchsia_io;

zx::status<fidl::ClientEnd<fuchsia_driver_compat::Device>> ConnectToParentDevice(
    const driver::Namespace* ns, std::string_view name) {
  auto result = ns->OpenService<fuchsia_driver_compat::Service>(name);
  if (result.is_error()) {
    return result.take_error();
  }
  return result.value().connect_device();
}

}  // namespace

// static
zx::status<std::unique_ptr<ExampleDriver>> ExampleDriver::Start(
    fdf::wire::DriverStartArgs& start_args, fdf::UnownedDispatcher dispatcher,
    fidl::WireSharedClient<fdf::Node> node, driver::Namespace ns, driver::Logger logger) {
  auto driver = std::make_unique<ExampleDriver>(dispatcher->async_dispatcher(), std::move(node),
                                                std::move(ns), std::move(logger));
  auto result = driver->Run(dispatcher->async_dispatcher(), std::move(start_args.outgoing_dir()));
  if (result.is_error()) {
    return result.take_error();
  }
  return zx::ok(std::move(driver));
}

zx::status<> ExampleDriver::Run(async_dispatcher* dispatcher,
                                fidl::ServerEnd<fio::Directory> outgoing_dir) {
  // Connect to parent.
  auto parent = ConnectToParentDevice(&ns_, "default");
  if (parent.status_value() != ZX_OK) {
    FDF_SLOG(ERROR, "Failed to connect to parent", KV("status", parent.status_string()));
    return parent.take_error();
  }

  FDF_SLOG(INFO, "**** Hello world ****");
  return zx::ok();
}

}  // namespace example_driver

FUCHSIA_DRIVER_RECORD_CPP_V1(example_driver::ExampleDriver);
