///
/// JLocaleInfo.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 "LocaleInfo.hpp"

#include <optional>
#include <string>

namespace margelo::nitro::one {

  using namespace facebook;

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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct LocaleInfo by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    LocaleInfo toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldLanguageTag = clazz->getField<jni::JString>("languageTag");
      jni::local_ref<jni::JString> languageTag = this->getFieldValue(fieldLanguageTag);
      static const auto fieldLanguageCode = clazz->getField<jni::JString>("languageCode");
      jni::local_ref<jni::JString> languageCode = this->getFieldValue(fieldLanguageCode);
      static const auto fieldLanguageScriptCode = clazz->getField<jni::JString>("languageScriptCode");
      jni::local_ref<jni::JString> languageScriptCode = this->getFieldValue(fieldLanguageScriptCode);
      static const auto fieldRegionCode = clazz->getField<jni::JString>("regionCode");
      jni::local_ref<jni::JString> regionCode = this->getFieldValue(fieldRegionCode);
      static const auto fieldLanguageRegionCode = clazz->getField<jni::JString>("languageRegionCode");
      jni::local_ref<jni::JString> languageRegionCode = this->getFieldValue(fieldLanguageRegionCode);
      static const auto fieldCurrencyCode = clazz->getField<jni::JString>("currencyCode");
      jni::local_ref<jni::JString> currencyCode = this->getFieldValue(fieldCurrencyCode);
      static const auto fieldCurrencySymbol = clazz->getField<jni::JString>("currencySymbol");
      jni::local_ref<jni::JString> currencySymbol = this->getFieldValue(fieldCurrencySymbol);
      static const auto fieldLanguageCurrencyCode = clazz->getField<jni::JString>("languageCurrencyCode");
      jni::local_ref<jni::JString> languageCurrencyCode = this->getFieldValue(fieldLanguageCurrencyCode);
      static const auto fieldLanguageCurrencySymbol = clazz->getField<jni::JString>("languageCurrencySymbol");
      jni::local_ref<jni::JString> languageCurrencySymbol = this->getFieldValue(fieldLanguageCurrencySymbol);
      static const auto fieldDecimalSeparator = clazz->getField<jni::JString>("decimalSeparator");
      jni::local_ref<jni::JString> decimalSeparator = this->getFieldValue(fieldDecimalSeparator);
      static const auto fieldDigitGroupingSeparator = clazz->getField<jni::JString>("digitGroupingSeparator");
      jni::local_ref<jni::JString> digitGroupingSeparator = this->getFieldValue(fieldDigitGroupingSeparator);
      static const auto fieldTextDirection = clazz->getField<jni::JString>("textDirection");
      jni::local_ref<jni::JString> textDirection = this->getFieldValue(fieldTextDirection);
      static const auto fieldMeasurementSystem = clazz->getField<jni::JString>("measurementSystem");
      jni::local_ref<jni::JString> measurementSystem = this->getFieldValue(fieldMeasurementSystem);
      static const auto fieldTemperatureUnit = clazz->getField<jni::JString>("temperatureUnit");
      jni::local_ref<jni::JString> temperatureUnit = this->getFieldValue(fieldTemperatureUnit);
      return LocaleInfo(
        languageTag->toStdString(),
        languageCode != nullptr ? std::make_optional(languageCode->toStdString()) : std::nullopt,
        languageScriptCode != nullptr ? std::make_optional(languageScriptCode->toStdString()) : std::nullopt,
        regionCode != nullptr ? std::make_optional(regionCode->toStdString()) : std::nullopt,
        languageRegionCode != nullptr ? std::make_optional(languageRegionCode->toStdString()) : std::nullopt,
        currencyCode != nullptr ? std::make_optional(currencyCode->toStdString()) : std::nullopt,
        currencySymbol != nullptr ? std::make_optional(currencySymbol->toStdString()) : std::nullopt,
        languageCurrencyCode != nullptr ? std::make_optional(languageCurrencyCode->toStdString()) : std::nullopt,
        languageCurrencySymbol != nullptr ? std::make_optional(languageCurrencySymbol->toStdString()) : std::nullopt,
        decimalSeparator != nullptr ? std::make_optional(decimalSeparator->toStdString()) : std::nullopt,
        digitGroupingSeparator != nullptr ? std::make_optional(digitGroupingSeparator->toStdString()) : std::nullopt,
        textDirection->toStdString(),
        measurementSystem != nullptr ? std::make_optional(measurementSystem->toStdString()) : std::nullopt,
        temperatureUnit != nullptr ? std::make_optional(temperatureUnit->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<JLocaleInfo::javaobject> fromCpp(const LocaleInfo& value) {
      using JSignature = JLocaleInfo(jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, 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.languageTag),
        value.languageCode.has_value() ? jni::make_jstring(value.languageCode.value()) : nullptr,
        value.languageScriptCode.has_value() ? jni::make_jstring(value.languageScriptCode.value()) : nullptr,
        value.regionCode.has_value() ? jni::make_jstring(value.regionCode.value()) : nullptr,
        value.languageRegionCode.has_value() ? jni::make_jstring(value.languageRegionCode.value()) : nullptr,
        value.currencyCode.has_value() ? jni::make_jstring(value.currencyCode.value()) : nullptr,
        value.currencySymbol.has_value() ? jni::make_jstring(value.currencySymbol.value()) : nullptr,
        value.languageCurrencyCode.has_value() ? jni::make_jstring(value.languageCurrencyCode.value()) : nullptr,
        value.languageCurrencySymbol.has_value() ? jni::make_jstring(value.languageCurrencySymbol.value()) : nullptr,
        value.decimalSeparator.has_value() ? jni::make_jstring(value.decimalSeparator.value()) : nullptr,
        value.digitGroupingSeparator.has_value() ? jni::make_jstring(value.digitGroupingSeparator.value()) : nullptr,
        jni::make_jstring(value.textDirection),
        value.measurementSystem.has_value() ? jni::make_jstring(value.measurementSystem.value()) : nullptr,
        value.temperatureUnit.has_value() ? jni::make_jstring(value.temperatureUnit.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::one
