// Copyright 2022 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 "composite_sample.h"

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

namespace composite_sample {

zx::result<> CompositeSampleDriver::Start() {
  auto result = PrintTopologicalPath("acpi-GFBY");
  if (result.is_error()) {
    FDF_SLOG(ERROR, "Failed to print topological path for \"acpi-GFBY\"",
             KV("status", result.status_string()));
    return result.take_error();
  }

  result = PrintTopologicalPath("acpi-GFRT");
  if (result.is_error()) {
    FDF_SLOG(ERROR, "Failed to print topological path for \"acpi-GFBY\"",
             KV("status", result.status_string()));
    return result.take_error();
  }

  return zx::ok();
}

// Print the topological path for a given parent device node.
zx::result<> CompositeSampleDriver::PrintTopologicalPath(std::string_view name) {
  // Connect to the parent device node.
  auto parent =
      driver::Connect<fuchsia_driver_compat::Service::Device>(*context().incoming(), name);
  if (parent.is_error()) {
    FDF_SLOG(ERROR, "Failed to open compat service device", KV("status", parent.status_string()));
    return parent.take_error();
  }

  // Retrieve the path of the device node from the `fuchsia.driver.compat` service
  auto client = fidl::WireSyncClient(std::move(parent.value()));
  auto path_result = client->GetTopologicalPath();
  if (!path_result.ok()) {
    FDF_SLOG(ERROR, "Failed to get topological path", KV("status", path_result.status_string()));
    return zx::error(path_result.status());
  }

  std::string path(path_result->path.get());
  FDF_SLOG(INFO, "Topological path", KV("instance_name", std::string(name).c_str()),
           KV("path", path.c_str()));

  return zx::ok();
}

}  // namespace composite_sample

FUCHSIA_DRIVER_RECORD_CPP_V2(driver::Record<composite_sample::CompositeSampleDriver>);
