///
/// JDomainEvent.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 "DomainEvent.hpp"

#include "AviationInterruptionMode.hpp"
#include "DomainEventType.hpp"
#include "ItemSource.hpp"
#include "JAviationInterruptionMode.hpp"
#include "JDomainEventType.hpp"
#include "JItemSource.hpp"
#include "JMediaPosition.hpp"
#include "JPlaybackState.hpp"
#include "JTtffSource.hpp"
#include "MediaPosition.hpp"
#include "PlaybackState.hpp"
#include "TtffSource.hpp"
#include <optional>
#include <string>

namespace margelo::nitro::aviation {

  using namespace facebook;

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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct DomainEvent by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    DomainEvent toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldType = clazz->getField<JDomainEventType>("type");
      jni::local_ref<JDomainEventType> type = this->getFieldValue(fieldType);
      static const auto fieldQueueIndex = clazz->getField<jni::JDouble>("queueIndex");
      jni::local_ref<jni::JDouble> queueIndex = this->getFieldValue(fieldQueueIndex);
      static const auto fieldOldState = clazz->getField<JPlaybackState>("oldState");
      jni::local_ref<JPlaybackState> oldState = this->getFieldValue(fieldOldState);
      static const auto fieldNewState = clazz->getField<JPlaybackState>("newState");
      jni::local_ref<JPlaybackState> newState = this->getFieldValue(fieldNewState);
      static const auto fieldPosition = clazz->getField<JMediaPosition>("position");
      jni::local_ref<JMediaPosition> position = this->getFieldValue(fieldPosition);
      static const auto fieldItemSource = clazz->getField<JItemSource>("itemSource");
      jni::local_ref<JItemSource> itemSource = this->getFieldValue(fieldItemSource);
      static const auto fieldErrorMessage = clazz->getField<jni::JString>("errorMessage");
      jni::local_ref<jni::JString> errorMessage = this->getFieldValue(fieldErrorMessage);
      static const auto fieldErrorCode = clazz->getField<jni::JString>("errorCode");
      jni::local_ref<jni::JString> errorCode = this->getFieldValue(fieldErrorCode);
      static const auto fieldRate = clazz->getField<jni::JDouble>("rate");
      jni::local_ref<jni::JDouble> rate = this->getFieldValue(fieldRate);
      static const auto fieldVolume = clazz->getField<jni::JDouble>("volume");
      jni::local_ref<jni::JDouble> volume = this->getFieldValue(fieldVolume);
      static const auto fieldMuted = clazz->getField<jni::JBoolean>("muted");
      jni::local_ref<jni::JBoolean> muted = this->getFieldValue(fieldMuted);
      static const auto fieldUri = clazz->getField<jni::JString>("uri");
      jni::local_ref<jni::JString> uri = this->getFieldValue(fieldUri);
      static const auto fieldBytes = clazz->getField<jni::JDouble>("bytes");
      jni::local_ref<jni::JDouble> bytes = this->getFieldValue(fieldBytes);
      static const auto fieldLayer = clazz->getField<jni::JDouble>("layer");
      jni::local_ref<jni::JDouble> layer = this->getFieldValue(fieldLayer);
      static const auto fieldDurationMs = clazz->getField<jni::JDouble>("durationMs");
      jni::local_ref<jni::JDouble> durationMs = this->getFieldValue(fieldDurationMs);
      static const auto fieldSource = clazz->getField<JTtffSource>("source");
      jni::local_ref<JTtffSource> source = this->getFieldValue(fieldSource);
      static const auto fieldError = clazz->getField<jni::JString>("error");
      jni::local_ref<jni::JString> error = this->getFieldValue(fieldError);
      static const auto fieldVideoBitrateBps = clazz->getField<jni::JDouble>("videoBitrateBps");
      jni::local_ref<jni::JDouble> videoBitrateBps = this->getFieldValue(fieldVideoBitrateBps);
      static const auto fieldAudioBitrateBps = clazz->getField<jni::JDouble>("audioBitrateBps");
      jni::local_ref<jni::JDouble> audioBitrateBps = this->getFieldValue(fieldAudioBitrateBps);
      static const auto fieldAdBreakIndex = clazz->getField<jni::JDouble>("adBreakIndex");
      jni::local_ref<jni::JDouble> adBreakIndex = this->getFieldValue(fieldAdBreakIndex);
      static const auto fieldAdBreakTimeMs = clazz->getField<jni::JDouble>("adBreakTimeMs");
      jni::local_ref<jni::JDouble> adBreakTimeMs = this->getFieldValue(fieldAdBreakTimeMs);
      static const auto fieldTotalAdsInBreak = clazz->getField<jni::JDouble>("totalAdsInBreak");
      jni::local_ref<jni::JDouble> totalAdsInBreak = this->getFieldValue(fieldTotalAdsInBreak);
      static const auto fieldAdId = clazz->getField<jni::JString>("adId");
      jni::local_ref<jni::JString> adId = this->getFieldValue(fieldAdId);
      static const auto fieldAdTitle = clazz->getField<jni::JString>("adTitle");
      jni::local_ref<jni::JString> adTitle = this->getFieldValue(fieldAdTitle);
      static const auto fieldAdDurationMs = clazz->getField<jni::JDouble>("adDurationMs");
      jni::local_ref<jni::JDouble> adDurationMs = this->getFieldValue(fieldAdDurationMs);
      static const auto fieldAdCurrentMs = clazz->getField<jni::JDouble>("adCurrentMs");
      jni::local_ref<jni::JDouble> adCurrentMs = this->getFieldValue(fieldAdCurrentMs);
      static const auto fieldAdIndexInBreak = clazz->getField<jni::JDouble>("adIndexInBreak");
      jni::local_ref<jni::JDouble> adIndexInBreak = this->getFieldValue(fieldAdIndexInBreak);
      static const auto fieldIsSkippable = clazz->getField<jni::JBoolean>("isSkippable");
      jni::local_ref<jni::JBoolean> isSkippable = this->getFieldValue(fieldIsSkippable);
      static const auto fieldSkipOffsetMs = clazz->getField<jni::JDouble>("skipOffsetMs");
      jni::local_ref<jni::JDouble> skipOffsetMs = this->getFieldValue(fieldSkipOffsetMs);
      static const auto fieldBegan = clazz->getField<jni::JBoolean>("began");
      jni::local_ref<jni::JBoolean> began = this->getFieldValue(fieldBegan);
      static const auto fieldShouldResume = clazz->getField<jni::JBoolean>("shouldResume");
      jni::local_ref<jni::JBoolean> shouldResume = this->getFieldValue(fieldShouldResume);
      static const auto fieldResumePolicy = clazz->getField<JAviationInterruptionMode>("resumePolicy");
      jni::local_ref<JAviationInterruptionMode> resumePolicy = this->getFieldValue(fieldResumePolicy);
      return DomainEvent(
        type->toCpp(),
        queueIndex != nullptr ? std::make_optional(queueIndex->value()) : std::nullopt,
        oldState != nullptr ? std::make_optional(oldState->toCpp()) : std::nullopt,
        newState != nullptr ? std::make_optional(newState->toCpp()) : std::nullopt,
        position != nullptr ? std::make_optional(position->toCpp()) : std::nullopt,
        itemSource != nullptr ? std::make_optional(itemSource->toCpp()) : std::nullopt,
        errorMessage != nullptr ? std::make_optional(errorMessage->toStdString()) : std::nullopt,
        errorCode != nullptr ? std::make_optional(errorCode->toStdString()) : std::nullopt,
        rate != nullptr ? std::make_optional(rate->value()) : std::nullopt,
        volume != nullptr ? std::make_optional(volume->value()) : std::nullopt,
        muted != nullptr ? std::make_optional(static_cast<bool>(muted->value())) : std::nullopt,
        uri != nullptr ? std::make_optional(uri->toStdString()) : std::nullopt,
        bytes != nullptr ? std::make_optional(bytes->value()) : std::nullopt,
        layer != nullptr ? std::make_optional(layer->value()) : std::nullopt,
        durationMs != nullptr ? std::make_optional(durationMs->value()) : std::nullopt,
        source != nullptr ? std::make_optional(source->toCpp()) : std::nullopt,
        error != nullptr ? std::make_optional(error->toStdString()) : std::nullopt,
        videoBitrateBps != nullptr ? std::make_optional(videoBitrateBps->value()) : std::nullopt,
        audioBitrateBps != nullptr ? std::make_optional(audioBitrateBps->value()) : std::nullopt,
        adBreakIndex != nullptr ? std::make_optional(adBreakIndex->value()) : std::nullopt,
        adBreakTimeMs != nullptr ? std::make_optional(adBreakTimeMs->value()) : std::nullopt,
        totalAdsInBreak != nullptr ? std::make_optional(totalAdsInBreak->value()) : std::nullopt,
        adId != nullptr ? std::make_optional(adId->toStdString()) : std::nullopt,
        adTitle != nullptr ? std::make_optional(adTitle->toStdString()) : std::nullopt,
        adDurationMs != nullptr ? std::make_optional(adDurationMs->value()) : std::nullopt,
        adCurrentMs != nullptr ? std::make_optional(adCurrentMs->value()) : std::nullopt,
        adIndexInBreak != nullptr ? std::make_optional(adIndexInBreak->value()) : std::nullopt,
        isSkippable != nullptr ? std::make_optional(static_cast<bool>(isSkippable->value())) : std::nullopt,
        skipOffsetMs != nullptr ? std::make_optional(skipOffsetMs->value()) : std::nullopt,
        began != nullptr ? std::make_optional(static_cast<bool>(began->value())) : std::nullopt,
        shouldResume != nullptr ? std::make_optional(static_cast<bool>(shouldResume->value())) : std::nullopt,
        resumePolicy != nullptr ? std::make_optional(resumePolicy->toCpp()) : 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<JDomainEvent::javaobject> fromCpp(const DomainEvent& value) {
      using JSignature = JDomainEvent(jni::alias_ref<JDomainEventType>, jni::alias_ref<jni::JDouble>, jni::alias_ref<JPlaybackState>, jni::alias_ref<JPlaybackState>, jni::alias_ref<JMediaPosition>, jni::alias_ref<JItemSource>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<JTtffSource>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<JAviationInterruptionMode>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        JDomainEventType::fromCpp(value.type),
        value.queueIndex.has_value() ? jni::JDouble::valueOf(value.queueIndex.value()) : nullptr,
        value.oldState.has_value() ? JPlaybackState::fromCpp(value.oldState.value()) : nullptr,
        value.newState.has_value() ? JPlaybackState::fromCpp(value.newState.value()) : nullptr,
        value.position.has_value() ? JMediaPosition::fromCpp(value.position.value()) : nullptr,
        value.itemSource.has_value() ? JItemSource::fromCpp(value.itemSource.value()) : nullptr,
        value.errorMessage.has_value() ? jni::make_jstring(value.errorMessage.value()) : nullptr,
        value.errorCode.has_value() ? jni::make_jstring(value.errorCode.value()) : nullptr,
        value.rate.has_value() ? jni::JDouble::valueOf(value.rate.value()) : nullptr,
        value.volume.has_value() ? jni::JDouble::valueOf(value.volume.value()) : nullptr,
        value.muted.has_value() ? jni::JBoolean::valueOf(value.muted.value()) : nullptr,
        value.uri.has_value() ? jni::make_jstring(value.uri.value()) : nullptr,
        value.bytes.has_value() ? jni::JDouble::valueOf(value.bytes.value()) : nullptr,
        value.layer.has_value() ? jni::JDouble::valueOf(value.layer.value()) : nullptr,
        value.durationMs.has_value() ? jni::JDouble::valueOf(value.durationMs.value()) : nullptr,
        value.source.has_value() ? JTtffSource::fromCpp(value.source.value()) : nullptr,
        value.error.has_value() ? jni::make_jstring(value.error.value()) : nullptr,
        value.videoBitrateBps.has_value() ? jni::JDouble::valueOf(value.videoBitrateBps.value()) : nullptr,
        value.audioBitrateBps.has_value() ? jni::JDouble::valueOf(value.audioBitrateBps.value()) : nullptr,
        value.adBreakIndex.has_value() ? jni::JDouble::valueOf(value.adBreakIndex.value()) : nullptr,
        value.adBreakTimeMs.has_value() ? jni::JDouble::valueOf(value.adBreakTimeMs.value()) : nullptr,
        value.totalAdsInBreak.has_value() ? jni::JDouble::valueOf(value.totalAdsInBreak.value()) : nullptr,
        value.adId.has_value() ? jni::make_jstring(value.adId.value()) : nullptr,
        value.adTitle.has_value() ? jni::make_jstring(value.adTitle.value()) : nullptr,
        value.adDurationMs.has_value() ? jni::JDouble::valueOf(value.adDurationMs.value()) : nullptr,
        value.adCurrentMs.has_value() ? jni::JDouble::valueOf(value.adCurrentMs.value()) : nullptr,
        value.adIndexInBreak.has_value() ? jni::JDouble::valueOf(value.adIndexInBreak.value()) : nullptr,
        value.isSkippable.has_value() ? jni::JBoolean::valueOf(value.isSkippable.value()) : nullptr,
        value.skipOffsetMs.has_value() ? jni::JDouble::valueOf(value.skipOffsetMs.value()) : nullptr,
        value.began.has_value() ? jni::JBoolean::valueOf(value.began.value()) : nullptr,
        value.shouldResume.has_value() ? jni::JBoolean::valueOf(value.shouldResume.value()) : nullptr,
        value.resumePolicy.has_value() ? JAviationInterruptionMode::fromCpp(value.resumePolicy.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::aviation
