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

#ifndef LIB_DRIVER_COMPONENT_CPP_NODE_ADD_ARGS_H_
#define LIB_DRIVER_COMPONENT_CPP_NODE_ADD_ARGS_H_

#include <fidl/fuchsia.component.decl/cpp/natural_types.h>
#include <fidl/fuchsia.component.decl/cpp/wire_types.h>
#include <fidl/fuchsia.driver.framework/cpp/natural_types.h>
#include <fidl/fuchsia.driver.framework/cpp/wire_types.h>
#include <lib/component/incoming/cpp/constants.h>
#include <lib/fidl/cpp/wire/arena.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/fidl_driver/cpp/transport.h>

#include <string_view>

namespace fdf {

fuchsia_component_decl::Offer MakeOffer(
    std::string_view service_name, std::string_view instance_name = component::kDefaultInstance);

fuchsia_component_decl::wire::Offer MakeOffer(
    fidl::AnyArena& arena, std::string_view service_name,
    std::string_view instance_name = component::kDefaultInstance);

template <typename Service>
fuchsia_driver_framework::Offer MakeOffer2(
    std::string_view instance_name = component::kDefaultInstance) {
  static_assert(fidl::IsServiceV<Service>, "Service must be a fidl Service");
  if constexpr (std::is_same_v<typename Service::Transport, fidl::internal::DriverTransport>) {
    return fuchsia_driver_framework::Offer::WithDriverTransport(
        MakeOffer(Service::Name, instance_name));
  } else if constexpr (std::is_same_v<typename Service::Transport,
                                      fidl::internal::ChannelTransport>) {
    return fuchsia_driver_framework::Offer::WithZirconTransport(
        MakeOffer(Service::Name, instance_name));
  } else {
    static_assert(std::false_type{}, "Service must be using DriverTransport or ChannelTransport.");
  }
}

template <typename Service>
fuchsia_driver_framework::wire::Offer MakeOffer2(
    fidl::AnyArena& arena, std::string_view instance_name = component::kDefaultInstance) {
  static_assert(fidl::IsServiceV<Service>, "Service must be a fidl Service");
  if constexpr (std::is_same_v<typename Service::Transport, fidl::internal::DriverTransport>) {
    return fuchsia_driver_framework::wire::Offer::WithDriverTransport(
        arena, MakeOffer(arena, Service::Name, instance_name));
  } else if constexpr (std::is_same_v<typename Service::Transport,
                                      fidl::internal::ChannelTransport>) {
    return fuchsia_driver_framework::wire::Offer::WithZirconTransport(
        arena, MakeOffer(arena, Service::Name, instance_name));
  } else {
    static_assert(std::false_type{}, "Service must be using DriverTransport or ChannelTransport.");
  }
}

inline fuchsia_driver_framework::NodeProperty MakeProperty(std::string_view key,
                                                           std::string_view value) {
  return fuchsia_driver_framework::NodeProperty{
      {.key = fuchsia_driver_framework::NodePropertyKey::WithStringValue(std::string(key)),
       .value = fuchsia_driver_framework::NodePropertyValue::WithStringValue(std::string(value))}};
}

inline fuchsia_driver_framework::NodeProperty MakeProperty(std::string_view key,
                                                           const char* value) {
  return MakeProperty(key, std::string_view(value));
}

inline fuchsia_driver_framework::NodeProperty MakeProperty(std::string_view key, bool value) {
  return fuchsia_driver_framework::NodeProperty{
      {.key = fuchsia_driver_framework::NodePropertyKey::WithStringValue(std::string(key)),
       .value = fuchsia_driver_framework::NodePropertyValue::WithBoolValue(value)}};
}

inline fuchsia_driver_framework::NodeProperty MakeProperty(std::string_view key, uint32_t value) {
  return fuchsia_driver_framework::NodeProperty{
      {.key = fuchsia_driver_framework::NodePropertyKey::WithStringValue(std::string(key)),
       .value = fuchsia_driver_framework::NodePropertyValue::WithIntValue(value)}};
}

inline fuchsia_driver_framework::wire::NodeProperty MakeProperty(fidl::AnyArena& arena,
                                                                 std::string_view key,
                                                                 std::string_view value) {
  return fuchsia_driver_framework::wire::NodeProperty{
      .key = fuchsia_driver_framework::wire::NodePropertyKey::WithStringValue(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithStringValue(arena, value)};
}

inline fuchsia_driver_framework::wire::NodeProperty MakeProperty(fidl::AnyArena& arena,
                                                                 std::string_view key,
                                                                 const char* value) {
  return MakeProperty(arena, key, std::string_view(value));
}

inline fuchsia_driver_framework::wire::NodeProperty MakeProperty(fidl::AnyArena& arena,
                                                                 std::string_view key, bool value) {
  return fuchsia_driver_framework::wire::NodeProperty{
      .key = fuchsia_driver_framework::wire::NodePropertyKey::WithStringValue(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithBoolValue(value)};
}

inline fuchsia_driver_framework::wire::NodeProperty MakeProperty(fidl::AnyArena& arena,
                                                                 std::string_view key,
                                                                 uint32_t value) {
  return fuchsia_driver_framework::wire::NodeProperty{
      .key = fuchsia_driver_framework::wire::NodePropertyKey::WithStringValue(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithIntValue(value)};
}

inline fuchsia_driver_framework::NodeProperty2 MakeProperty2(std::string_view key,
                                                             std::string_view value) {
  return fuchsia_driver_framework::NodeProperty2{
      {.key = std::string(key),
       .value = fuchsia_driver_framework::NodePropertyValue::WithStringValue(std::string(value))}};
}

inline fuchsia_driver_framework::NodeProperty2 MakeProperty2(std::string_view key,
                                                             const char* value) {
  return MakeProperty2(key, std::string_view(value));
}

inline fuchsia_driver_framework::NodeProperty2 MakeProperty2(std::string_view key, bool value) {
  return fuchsia_driver_framework::NodeProperty2{
      {.key = std::string(key),
       .value = fuchsia_driver_framework::NodePropertyValue::WithBoolValue(value)}};
}

inline fuchsia_driver_framework::NodeProperty2 MakeProperty2(std::string_view key, uint32_t value) {
  return fuchsia_driver_framework::NodeProperty2{
      {.key = std::string(key),
       .value = fuchsia_driver_framework::NodePropertyValue::WithIntValue(value)}};
}

inline fuchsia_driver_framework::wire::NodeProperty2 MakeProperty2(fidl::AnyArena& arena,
                                                                   std::string_view key,
                                                                   std::string_view value) {
  return fuchsia_driver_framework::wire::NodeProperty2{
      .key = fidl::StringView(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithStringValue(arena, value)};
}

inline fuchsia_driver_framework::wire::NodeProperty2 MakeProperty2(fidl::AnyArena& arena,
                                                                   std::string_view key,
                                                                   const char* value) {
  return MakeProperty2(arena, key, std::string_view(value));
}

inline fuchsia_driver_framework::wire::NodeProperty2 MakeProperty2(fidl::AnyArena& arena,
                                                                   std::string_view key,
                                                                   bool value) {
  return fuchsia_driver_framework::wire::NodeProperty2{
      .key = fidl::StringView(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithBoolValue(value)};
}

inline fuchsia_driver_framework::wire::NodeProperty2 MakeProperty2(fidl::AnyArena& arena,
                                                                   std::string_view key,
                                                                   uint32_t value) {
  return fuchsia_driver_framework::wire::NodeProperty2{
      .key = fidl::StringView(arena, key),
      .value = fuchsia_driver_framework::wire::NodePropertyValue::WithIntValue(value)};
}

}  // namespace fdf

#endif  // LIB_DRIVER_COMPONENT_CPP_NODE_ADD_ARGS_H_
