///
/// JTikTokInitializeOptions.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#pragma once

#include <fbjni/fbjni.h>
#include "TikTokInitializeOptions.hpp"

#include <optional>
#include <string>
#include <vector>

namespace margelo::nitro::tiktokappevents {

  using namespace facebook;

  /**
   * The C++ JNI bridge between the C++ struct "TikTokInitializeOptions" and the the Kotlin data class "TikTokInitializeOptions".
   */
  struct JTikTokInitializeOptions final: public jni::JavaClass<JTikTokInitializeOptions> {
  public:
    static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/tiktokappevents/TikTokInitializeOptions;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct TikTokInitializeOptions by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    TikTokInitializeOptions toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldAccessToken = clazz->getField<jni::JString>("accessToken");
      jni::local_ref<jni::JString> accessToken = this->getFieldValue(fieldAccessToken);
      static const auto fieldAppId = clazz->getField<jni::JString>("appId");
      jni::local_ref<jni::JString> appId = this->getFieldValue(fieldAppId);
      static const auto fieldTikTokAppIds = clazz->getField<jni::JArrayClass<jni::JString>>("tikTokAppIds");
      jni::local_ref<jni::JArrayClass<jni::JString>> tikTokAppIds = this->getFieldValue(fieldTikTokAppIds);
      static const auto fieldTrackingEnabled = clazz->getField<jni::JBoolean>("trackingEnabled");
      jni::local_ref<jni::JBoolean> trackingEnabled = this->getFieldValue(fieldTrackingEnabled);
      static const auto fieldAutomaticTrackingEnabled = clazz->getField<jni::JBoolean>("automaticTrackingEnabled");
      jni::local_ref<jni::JBoolean> automaticTrackingEnabled = this->getFieldValue(fieldAutomaticTrackingEnabled);
      static const auto fieldInstallTrackingEnabled = clazz->getField<jni::JBoolean>("installTrackingEnabled");
      jni::local_ref<jni::JBoolean> installTrackingEnabled = this->getFieldValue(fieldInstallTrackingEnabled);
      static const auto fieldLaunchTrackingEnabled = clazz->getField<jni::JBoolean>("launchTrackingEnabled");
      jni::local_ref<jni::JBoolean> launchTrackingEnabled = this->getFieldValue(fieldLaunchTrackingEnabled);
      static const auto fieldRetentionTrackingEnabled = clazz->getField<jni::JBoolean>("retentionTrackingEnabled");
      jni::local_ref<jni::JBoolean> retentionTrackingEnabled = this->getFieldValue(fieldRetentionTrackingEnabled);
      static const auto fieldPurchaseTrackingEnabled = clazz->getField<jni::JBoolean>("purchaseTrackingEnabled");
      jni::local_ref<jni::JBoolean> purchaseTrackingEnabled = this->getFieldValue(fieldPurchaseTrackingEnabled);
      static const auto fieldAdvertiserIdCollectionEnabled = clazz->getField<jni::JBoolean>("advertiserIdCollectionEnabled");
      jni::local_ref<jni::JBoolean> advertiserIdCollectionEnabled = this->getFieldValue(fieldAdvertiserIdCollectionEnabled);
      static const auto fieldSkAdNetworkSupportEnabled = clazz->getField<jni::JBoolean>("skAdNetworkSupportEnabled");
      jni::local_ref<jni::JBoolean> skAdNetworkSupportEnabled = this->getFieldValue(fieldSkAdNetworkSupportEnabled);
      static const auto fieldEnhancedDataPostbackEnabled = clazz->getField<jni::JBoolean>("enhancedDataPostbackEnabled");
      jni::local_ref<jni::JBoolean> enhancedDataPostbackEnabled = this->getFieldValue(fieldEnhancedDataPostbackEnabled);
      static const auto fieldLowPerformanceDevice = clazz->getField<jni::JBoolean>("lowPerformanceDevice");
      jni::local_ref<jni::JBoolean> lowPerformanceDevice = this->getFieldValue(fieldLowPerformanceDevice);
      static const auto fieldDebugModeEnabled = clazz->getField<jni::JBoolean>("debugModeEnabled");
      jni::local_ref<jni::JBoolean> debugModeEnabled = this->getFieldValue(fieldDebugModeEnabled);
      static const auto fieldLimitedDataUseEnabled = clazz->getField<jni::JBoolean>("limitedDataUseEnabled");
      jni::local_ref<jni::JBoolean> limitedDataUseEnabled = this->getFieldValue(fieldLimitedDataUseEnabled);
      static const auto fieldDelayForATTUserAuthorizationSeconds = clazz->getField<jni::JDouble>("delayForATTUserAuthorizationSeconds");
      jni::local_ref<jni::JDouble> delayForATTUserAuthorizationSeconds = this->getFieldValue(fieldDelayForATTUserAuthorizationSeconds);
      static const auto fieldCustomUserAgent = clazz->getField<jni::JString>("customUserAgent");
      jni::local_ref<jni::JString> customUserAgent = this->getFieldValue(fieldCustomUserAgent);
      static const auto fieldLogLevel = clazz->getField<jni::JString>("logLevel");
      jni::local_ref<jni::JString> logLevel = this->getFieldValue(fieldLogLevel);
      return TikTokInitializeOptions(
        accessToken->toStdString(),
        appId != nullptr ? std::make_optional(appId->toStdString()) : std::nullopt,
        tikTokAppIds != nullptr ? std::make_optional([&]() {
          size_t __size = tikTokAppIds->size();
          std::vector<std::string> __vector;
          __vector.reserve(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            auto __element = tikTokAppIds->getElement(__i);
            __vector.push_back(__element->toStdString());
          }
          return __vector;
        }()) : std::nullopt,
        trackingEnabled != nullptr ? std::make_optional(static_cast<bool>(trackingEnabled->value())) : std::nullopt,
        automaticTrackingEnabled != nullptr ? std::make_optional(static_cast<bool>(automaticTrackingEnabled->value())) : std::nullopt,
        installTrackingEnabled != nullptr ? std::make_optional(static_cast<bool>(installTrackingEnabled->value())) : std::nullopt,
        launchTrackingEnabled != nullptr ? std::make_optional(static_cast<bool>(launchTrackingEnabled->value())) : std::nullopt,
        retentionTrackingEnabled != nullptr ? std::make_optional(static_cast<bool>(retentionTrackingEnabled->value())) : std::nullopt,
        purchaseTrackingEnabled != nullptr ? std::make_optional(static_cast<bool>(purchaseTrackingEnabled->value())) : std::nullopt,
        advertiserIdCollectionEnabled != nullptr ? std::make_optional(static_cast<bool>(advertiserIdCollectionEnabled->value())) : std::nullopt,
        skAdNetworkSupportEnabled != nullptr ? std::make_optional(static_cast<bool>(skAdNetworkSupportEnabled->value())) : std::nullopt,
        enhancedDataPostbackEnabled != nullptr ? std::make_optional(static_cast<bool>(enhancedDataPostbackEnabled->value())) : std::nullopt,
        lowPerformanceDevice != nullptr ? std::make_optional(static_cast<bool>(lowPerformanceDevice->value())) : std::nullopt,
        debugModeEnabled != nullptr ? std::make_optional(static_cast<bool>(debugModeEnabled->value())) : std::nullopt,
        limitedDataUseEnabled != nullptr ? std::make_optional(static_cast<bool>(limitedDataUseEnabled->value())) : std::nullopt,
        delayForATTUserAuthorizationSeconds != nullptr ? std::make_optional(delayForATTUserAuthorizationSeconds->value()) : std::nullopt,
        customUserAgent != nullptr ? std::make_optional(customUserAgent->toStdString()) : std::nullopt,
        logLevel != nullptr ? std::make_optional(logLevel->toStdString()) : std::nullopt
      );
    }

  public:
    /**
     * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
     */
    [[maybe_unused]]
    static jni::local_ref<JTikTokInitializeOptions::javaobject> fromCpp(const TikTokInitializeOptions& value) {
      using JSignature = JTikTokInitializeOptions(jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JArrayClass<jni::JString>>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        jni::make_jstring(value.accessToken),
        value.appId.has_value() ? jni::make_jstring(value.appId.value()) : nullptr,
        value.tikTokAppIds.has_value() ? [&]() {
          size_t __size = value.tikTokAppIds.value().size();
          jni::local_ref<jni::JArrayClass<jni::JString>> __array = jni::JArrayClass<jni::JString>::newArray(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            const auto& __element = value.tikTokAppIds.value()[__i];
            auto __elementJni = jni::make_jstring(__element);
            __array->setElement(__i, *__elementJni);
          }
          return __array;
        }() : nullptr,
        value.trackingEnabled.has_value() ? jni::JBoolean::valueOf(value.trackingEnabled.value()) : nullptr,
        value.automaticTrackingEnabled.has_value() ? jni::JBoolean::valueOf(value.automaticTrackingEnabled.value()) : nullptr,
        value.installTrackingEnabled.has_value() ? jni::JBoolean::valueOf(value.installTrackingEnabled.value()) : nullptr,
        value.launchTrackingEnabled.has_value() ? jni::JBoolean::valueOf(value.launchTrackingEnabled.value()) : nullptr,
        value.retentionTrackingEnabled.has_value() ? jni::JBoolean::valueOf(value.retentionTrackingEnabled.value()) : nullptr,
        value.purchaseTrackingEnabled.has_value() ? jni::JBoolean::valueOf(value.purchaseTrackingEnabled.value()) : nullptr,
        value.advertiserIdCollectionEnabled.has_value() ? jni::JBoolean::valueOf(value.advertiserIdCollectionEnabled.value()) : nullptr,
        value.skAdNetworkSupportEnabled.has_value() ? jni::JBoolean::valueOf(value.skAdNetworkSupportEnabled.value()) : nullptr,
        value.enhancedDataPostbackEnabled.has_value() ? jni::JBoolean::valueOf(value.enhancedDataPostbackEnabled.value()) : nullptr,
        value.lowPerformanceDevice.has_value() ? jni::JBoolean::valueOf(value.lowPerformanceDevice.value()) : nullptr,
        value.debugModeEnabled.has_value() ? jni::JBoolean::valueOf(value.debugModeEnabled.value()) : nullptr,
        value.limitedDataUseEnabled.has_value() ? jni::JBoolean::valueOf(value.limitedDataUseEnabled.value()) : nullptr,
        value.delayForATTUserAuthorizationSeconds.has_value() ? jni::JDouble::valueOf(value.delayForATTUserAuthorizationSeconds.value()) : nullptr,
        value.customUserAgent.has_value() ? jni::make_jstring(value.customUserAgent.value()) : nullptr,
        value.logLevel.has_value() ? jni::make_jstring(value.logLevel.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::tiktokappevents
