///
/// JNativeTranscriptResult.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 "NativeTranscriptResult.hpp"

#include "JNativeTranscriptSegment.hpp"
#include "NativeTranscriptSegment.hpp"
#include <string>
#include <vector>

namespace margelo::nitro::clarion::azure {

  using namespace facebook;

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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct NativeTranscriptResult by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    NativeTranscriptResult toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldId = clazz->getField<jni::JString>("id");
      jni::local_ref<jni::JString> id = this->getFieldValue(fieldId);
      static const auto fieldSessionId = clazz->getField<jni::JString>("sessionId");
      jni::local_ref<jni::JString> sessionId = this->getFieldValue(fieldSessionId);
      static const auto fieldTimestamp = clazz->getField<double>("timestamp");
      double timestamp = this->getFieldValue(fieldTimestamp);
      static const auto fieldText = clazz->getField<jni::JString>("text");
      jni::local_ref<jni::JString> text = this->getFieldValue(fieldText);
      static const auto fieldIsFinal = clazz->getField<jboolean>("isFinal");
      jboolean isFinal = this->getFieldValue(fieldIsFinal);
      static const auto fieldLanguage = clazz->getField<jni::JString>("language");
      jni::local_ref<jni::JString> language = this->getFieldValue(fieldLanguage);
      static const auto fieldConfidence = clazz->getField<double>("confidence");
      double confidence = this->getFieldValue(fieldConfidence);
      static const auto fieldOffsetMs = clazz->getField<double>("offsetMs");
      double offsetMs = this->getFieldValue(fieldOffsetMs);
      static const auto fieldDurationMs = clazz->getField<double>("durationMs");
      double durationMs = this->getFieldValue(fieldDurationMs);
      static const auto fieldSpeakerId = clazz->getField<jni::JString>("speakerId");
      jni::local_ref<jni::JString> speakerId = this->getFieldValue(fieldSpeakerId);
      static const auto fieldSegments = clazz->getField<jni::JArrayClass<JNativeTranscriptSegment>>("segments");
      jni::local_ref<jni::JArrayClass<JNativeTranscriptSegment>> segments = this->getFieldValue(fieldSegments);
      return NativeTranscriptResult(
        id->toStdString(),
        sessionId->toStdString(),
        timestamp,
        text->toStdString(),
        static_cast<bool>(isFinal),
        language->toStdString(),
        confidence,
        offsetMs,
        durationMs,
        speakerId->toStdString(),
        [&](auto&& __input) {
          size_t __size = __input->size();
          std::vector<NativeTranscriptSegment> __vector;
          __vector.reserve(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            auto __element = __input->getElement(__i);
            __vector.push_back(__element->toCpp());
          }
          return __vector;
        }(segments)
      );
    }

  public:
    /**
     * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
     */
    [[maybe_unused]]
    static jni::local_ref<JNativeTranscriptResult::javaobject> fromCpp(const NativeTranscriptResult& value) {
      using JSignature = JNativeTranscriptResult(jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, double, jni::alias_ref<jni::JString>, jboolean, jni::alias_ref<jni::JString>, double, double, double, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JArrayClass<JNativeTranscriptSegment>>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        jni::make_jstring(value.id),
        jni::make_jstring(value.sessionId),
        value.timestamp,
        jni::make_jstring(value.text),
        value.isFinal,
        jni::make_jstring(value.language),
        value.confidence,
        value.offsetMs,
        value.durationMs,
        jni::make_jstring(value.speakerId),
        [&](auto&& __input) {
          size_t __size = __input.size();
          jni::local_ref<jni::JArrayClass<JNativeTranscriptSegment>> __array = jni::JArrayClass<JNativeTranscriptSegment>::newArray(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            const auto& __element = __input[__i];
            auto __elementJni = JNativeTranscriptSegment::fromCpp(__element);
            __array->setElement(__i, *__elementJni);
          }
          return __array;
        }(value.segments)
      );
    }
  };

} // namespace margelo::nitro::clarion::azure
