///
/// JIapkitPurchaseState.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 "IapkitPurchaseState.hpp"

namespace margelo::nitro::iap {

  using namespace facebook;

  /**
   * The C++ JNI bridge between the C++ enum "IapkitPurchaseState" and the the Kotlin enum "IapkitPurchaseState".
   */
  struct JIapkitPurchaseState final: public jni::JavaClass<JIapkitPurchaseState> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/IapkitPurchaseState;";

  public:
    /**
     * Convert this Java/Kotlin-based enum to the C++ enum IapkitPurchaseState.
     */
    [[maybe_unused]]
    [[nodiscard]]
    IapkitPurchaseState toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldOrdinal = clazz->getField<int>("value");
      int ordinal = this->getFieldValue(fieldOrdinal);
      return static_cast<IapkitPurchaseState>(ordinal);
    }

  public:
    /**
     * Create a Java/Kotlin-based enum with the given C++ enum's value.
     */
    [[maybe_unused]]
    static jni::alias_ref<JIapkitPurchaseState> fromCpp(IapkitPurchaseState value) {
      static const auto clazz = javaClassStatic();
      switch (value) {
        case IapkitPurchaseState::PENDING:
          static const auto fieldPENDING = clazz->getStaticField<JIapkitPurchaseState>("PENDING");
          return clazz->getStaticFieldValue(fieldPENDING);
        case IapkitPurchaseState::UNKNOWN:
          static const auto fieldUNKNOWN = clazz->getStaticField<JIapkitPurchaseState>("UNKNOWN");
          return clazz->getStaticFieldValue(fieldUNKNOWN);
        case IapkitPurchaseState::ENTITLED:
          static const auto fieldENTITLED = clazz->getStaticField<JIapkitPurchaseState>("ENTITLED");
          return clazz->getStaticFieldValue(fieldENTITLED);
        case IapkitPurchaseState::PENDING_ACKNOWLEDGMENT:
          static const auto fieldPENDING_ACKNOWLEDGMENT = clazz->getStaticField<JIapkitPurchaseState>("PENDING_ACKNOWLEDGMENT");
          return clazz->getStaticFieldValue(fieldPENDING_ACKNOWLEDGMENT);
        case IapkitPurchaseState::CANCELED:
          static const auto fieldCANCELED = clazz->getStaticField<JIapkitPurchaseState>("CANCELED");
          return clazz->getStaticFieldValue(fieldCANCELED);
        case IapkitPurchaseState::EXPIRED:
          static const auto fieldEXPIRED = clazz->getStaticField<JIapkitPurchaseState>("EXPIRED");
          return clazz->getStaticFieldValue(fieldEXPIRED);
        case IapkitPurchaseState::READY_TO_CONSUME:
          static const auto fieldREADY_TO_CONSUME = clazz->getStaticField<JIapkitPurchaseState>("READY_TO_CONSUME");
          return clazz->getStaticFieldValue(fieldREADY_TO_CONSUME);
        case IapkitPurchaseState::CONSUMED:
          static const auto fieldCONSUMED = clazz->getStaticField<JIapkitPurchaseState>("CONSUMED");
          return clazz->getStaticFieldValue(fieldCONSUMED);
        case IapkitPurchaseState::INAUTHENTIC:
          static const auto fieldINAUTHENTIC = clazz->getStaticField<JIapkitPurchaseState>("INAUTHENTIC");
          return clazz->getStaticFieldValue(fieldINAUTHENTIC);
        default:
          std::string stringValue = std::to_string(static_cast<int>(value));
          throw std::invalid_argument("Invalid enum value (" + stringValue + "!");
      }
    }
  };

} // namespace margelo::nitro::iap
