// Copyright 2023 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/devices/usb/lib/usb-phy/include/usb-phy/usb-phy.h"

#include <ddktl/device.h>

namespace usb_phy {

zx::result<UsbPhyClient> UsbPhyClient::Create(zx_device_t* parent,
                                              const std::string_view fragment_name) {
  // Prefer Banjo over FIDL.
  auto phy = ddk::UsbPhyProtocolClient(parent, fragment_name.data());
  if (phy.is_valid()) {
    return zx::ok(UsbPhyClient(phy));
  }

  // Try to get FIDL.
  auto client_end = ddk::Device<void>::DdkConnectFragmentRuntimeProtocol<
      fuchsia_hardware_usb_phy::Service::Device>(parent, fragment_name.data());
  if (client_end.is_ok()) {
    return zx::ok(UsbPhyClient(std::move(client_end.value())));
  }

  zxlogf(ERROR, "Could not get either Banjo or FIDL client");
  return zx::error(ZX_ERR_NOT_FOUND);
}

zx::result<UsbPhyClient> UsbPhyClient::Create(zx_device_t* parent) {
  // Prefer Banjo over FIDL.
  auto phy = ddk::UsbPhyProtocolClient(parent);
  if (phy.is_valid()) {
    return zx::ok(UsbPhyClient(phy));
  }

  // Try to get FIDL.
  auto client_end =
      ddk::Device<void>::DdkConnectRuntimeProtocol<fuchsia_hardware_usb_phy::Service::Device>(
          parent);
  if (client_end.is_ok()) {
    return zx::ok(UsbPhyClient(std::move(client_end.value())));
  }

  zxlogf(ERROR, "Could not get either Banjo or FIDL client");
  return zx::error(ZX_ERR_NOT_FOUND);
}

zx_status_t UsbPhyClient::ConnectStatusChanged(bool connected) {
  if (std::holds_alternative<BanjoClient>(client_)) {
    std::get<BanjoClient>(client_).ConnectStatusChanged(connected);
    return ZX_OK;
  }

  fdf::Arena arena('UPHY');
  auto result = std::get<FidlClient>(client_).buffer(arena)->ConnectStatusChanged(connected);
  if (!result.ok()) {
    zxlogf(ERROR, "ConnectStatusChanged failed %s", result.FormatDescription().c_str());
    return result.status();
  }
  if (result->is_error()) {
    zxlogf(ERROR, "ConnectStatusChanged failed %d", result->error_value());
    return result->error_value();
  }
  return ZX_OK;
}

}  // namespace usb_phy
