///
/// JMailSearchCriteria.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 "MailSearchCriteria.hpp"

#include <optional>
#include <string>

namespace margelo::nitro::mailengine {

  using namespace facebook;

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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct MailSearchCriteria by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    MailSearchCriteria toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldText = clazz->getField<jni::JString>("text");
      jni::local_ref<jni::JString> text = this->getFieldValue(fieldText);
      static const auto fieldFrom = clazz->getField<jni::JString>("from");
      jni::local_ref<jni::JString> from = this->getFieldValue(fieldFrom);
      static const auto fieldTo = clazz->getField<jni::JString>("to");
      jni::local_ref<jni::JString> to = this->getFieldValue(fieldTo);
      static const auto fieldSubject = clazz->getField<jni::JString>("subject");
      jni::local_ref<jni::JString> subject = this->getFieldValue(fieldSubject);
      static const auto fieldBody = clazz->getField<jni::JString>("body");
      jni::local_ref<jni::JString> body = this->getFieldValue(fieldBody);
      static const auto fieldSeen = clazz->getField<jni::JBoolean>("seen");
      jni::local_ref<jni::JBoolean> seen = this->getFieldValue(fieldSeen);
      static const auto fieldFlagged = clazz->getField<jni::JBoolean>("flagged");
      jni::local_ref<jni::JBoolean> flagged = this->getFieldValue(fieldFlagged);
      static const auto fieldAnswered = clazz->getField<jni::JBoolean>("answered");
      jni::local_ref<jni::JBoolean> answered = this->getFieldValue(fieldAnswered);
      static const auto fieldSinceDateMs = clazz->getField<jni::JDouble>("sinceDateMs");
      jni::local_ref<jni::JDouble> sinceDateMs = this->getFieldValue(fieldSinceDateMs);
      static const auto fieldBeforeDateMs = clazz->getField<jni::JDouble>("beforeDateMs");
      jni::local_ref<jni::JDouble> beforeDateMs = this->getFieldValue(fieldBeforeDateMs);
      static const auto fieldUidRangeStart = clazz->getField<jni::JDouble>("uidRangeStart");
      jni::local_ref<jni::JDouble> uidRangeStart = this->getFieldValue(fieldUidRangeStart);
      static const auto fieldUidRangeEnd = clazz->getField<jni::JDouble>("uidRangeEnd");
      jni::local_ref<jni::JDouble> uidRangeEnd = this->getFieldValue(fieldUidRangeEnd);
      return MailSearchCriteria(
        text != nullptr ? std::make_optional(text->toStdString()) : std::nullopt,
        from != nullptr ? std::make_optional(from->toStdString()) : std::nullopt,
        to != nullptr ? std::make_optional(to->toStdString()) : std::nullopt,
        subject != nullptr ? std::make_optional(subject->toStdString()) : std::nullopt,
        body != nullptr ? std::make_optional(body->toStdString()) : std::nullopt,
        seen != nullptr ? std::make_optional(static_cast<bool>(seen->value())) : std::nullopt,
        flagged != nullptr ? std::make_optional(static_cast<bool>(flagged->value())) : std::nullopt,
        answered != nullptr ? std::make_optional(static_cast<bool>(answered->value())) : std::nullopt,
        sinceDateMs != nullptr ? std::make_optional(sinceDateMs->value()) : std::nullopt,
        beforeDateMs != nullptr ? std::make_optional(beforeDateMs->value()) : std::nullopt,
        uidRangeStart != nullptr ? std::make_optional(uidRangeStart->value()) : std::nullopt,
        uidRangeEnd != nullptr ? std::make_optional(uidRangeEnd->value()) : 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<JMailSearchCriteria::javaobject> fromCpp(const MailSearchCriteria& value) {
      using JSignature = JMailSearchCriteria(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::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JBoolean>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.text.has_value() ? jni::make_jstring(value.text.value()) : nullptr,
        value.from.has_value() ? jni::make_jstring(value.from.value()) : nullptr,
        value.to.has_value() ? jni::make_jstring(value.to.value()) : nullptr,
        value.subject.has_value() ? jni::make_jstring(value.subject.value()) : nullptr,
        value.body.has_value() ? jni::make_jstring(value.body.value()) : nullptr,
        value.seen.has_value() ? jni::JBoolean::valueOf(value.seen.value()) : nullptr,
        value.flagged.has_value() ? jni::JBoolean::valueOf(value.flagged.value()) : nullptr,
        value.answered.has_value() ? jni::JBoolean::valueOf(value.answered.value()) : nullptr,
        value.sinceDateMs.has_value() ? jni::JDouble::valueOf(value.sinceDateMs.value()) : nullptr,
        value.beforeDateMs.has_value() ? jni::JDouble::valueOf(value.beforeDateMs.value()) : nullptr,
        value.uidRangeStart.has_value() ? jni::JDouble::valueOf(value.uidRangeStart.value()) : nullptr,
        value.uidRangeEnd.has_value() ? jni::JDouble::valueOf(value.uidRangeEnd.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::mailengine
