///
/// JDfuError.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 "DfuError.hpp"

namespace margelo::nitro::co::zyke::dfu {

  using namespace facebook;

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

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

  public:
    /**
     * Create a Java/Kotlin-based enum with the given C++ enum's value.
     */
    [[maybe_unused]]
    static jni::alias_ref<JDfuError> fromCpp(DfuError value) {
      static const auto clazz = javaClassStatic();
      switch (value) {
        case DfuError::REMOTELEGACYDFUINVALIDSTATE:
          static const auto fieldREMOTELEGACYDFUINVALIDSTATE = clazz->getStaticField<JDfuError>("REMOTELEGACYDFUINVALIDSTATE");
          return clazz->getStaticFieldValue(fieldREMOTELEGACYDFUINVALIDSTATE);
        case DfuError::REMOTELEGACYDFUNOTSUPPORTED:
          static const auto fieldREMOTELEGACYDFUNOTSUPPORTED = clazz->getStaticField<JDfuError>("REMOTELEGACYDFUNOTSUPPORTED");
          return clazz->getStaticFieldValue(fieldREMOTELEGACYDFUNOTSUPPORTED);
        case DfuError::REMOTELEGACYDFUDATAEXCEEDSLIMIT:
          static const auto fieldREMOTELEGACYDFUDATAEXCEEDSLIMIT = clazz->getStaticField<JDfuError>("REMOTELEGACYDFUDATAEXCEEDSLIMIT");
          return clazz->getStaticFieldValue(fieldREMOTELEGACYDFUDATAEXCEEDSLIMIT);
        case DfuError::REMOTELEGACYDFUCRCERROR:
          static const auto fieldREMOTELEGACYDFUCRCERROR = clazz->getStaticField<JDfuError>("REMOTELEGACYDFUCRCERROR");
          return clazz->getStaticFieldValue(fieldREMOTELEGACYDFUCRCERROR);
        case DfuError::REMOTELEGACYDFUOPERATIONFAILED:
          static const auto fieldREMOTELEGACYDFUOPERATIONFAILED = clazz->getStaticField<JDfuError>("REMOTELEGACYDFUOPERATIONFAILED");
          return clazz->getStaticFieldValue(fieldREMOTELEGACYDFUOPERATIONFAILED);
        case DfuError::REMOTESECUREDFUOPCODENOTSUPPORTED:
          static const auto fieldREMOTESECUREDFUOPCODENOTSUPPORTED = clazz->getStaticField<JDfuError>("REMOTESECUREDFUOPCODENOTSUPPORTED");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUOPCODENOTSUPPORTED);
        case DfuError::REMOTESECUREDFUINVALIDPARAMETER:
          static const auto fieldREMOTESECUREDFUINVALIDPARAMETER = clazz->getStaticField<JDfuError>("REMOTESECUREDFUINVALIDPARAMETER");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUINVALIDPARAMETER);
        case DfuError::REMOTESECUREDFUINSUFFICIENTRESOURCES:
          static const auto fieldREMOTESECUREDFUINSUFFICIENTRESOURCES = clazz->getStaticField<JDfuError>("REMOTESECUREDFUINSUFFICIENTRESOURCES");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUINSUFFICIENTRESOURCES);
        case DfuError::REMOTESECUREDFUINVALIDOBJECT:
          static const auto fieldREMOTESECUREDFUINVALIDOBJECT = clazz->getStaticField<JDfuError>("REMOTESECUREDFUINVALIDOBJECT");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUINVALIDOBJECT);
        case DfuError::REMOTESECUREDFUSIGNATUREMISMATCH:
          static const auto fieldREMOTESECUREDFUSIGNATUREMISMATCH = clazz->getStaticField<JDfuError>("REMOTESECUREDFUSIGNATUREMISMATCH");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUSIGNATUREMISMATCH);
        case DfuError::REMOTESECUREDFUUNSUPPORTEDTYPE:
          static const auto fieldREMOTESECUREDFUUNSUPPORTEDTYPE = clazz->getStaticField<JDfuError>("REMOTESECUREDFUUNSUPPORTEDTYPE");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUUNSUPPORTEDTYPE);
        case DfuError::REMOTESECUREDFUOPERATIONNOTPERMITTED:
          static const auto fieldREMOTESECUREDFUOPERATIONNOTPERMITTED = clazz->getStaticField<JDfuError>("REMOTESECUREDFUOPERATIONNOTPERMITTED");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUOPERATIONNOTPERMITTED);
        case DfuError::REMOTESECUREDFUOPERATIONFAILED:
          static const auto fieldREMOTESECUREDFUOPERATIONFAILED = clazz->getStaticField<JDfuError>("REMOTESECUREDFUOPERATIONFAILED");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUOPERATIONFAILED);
        case DfuError::REMOTESECUREDFUEXTENDEDERROR:
          static const auto fieldREMOTESECUREDFUEXTENDEDERROR = clazz->getStaticField<JDfuError>("REMOTESECUREDFUEXTENDEDERROR");
          return clazz->getStaticFieldValue(fieldREMOTESECUREDFUEXTENDEDERROR);
        case DfuError::REMOTEEXTENDEDERRORWRONGCOMMANDFORMAT:
          static const auto fieldREMOTEEXTENDEDERRORWRONGCOMMANDFORMAT = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORWRONGCOMMANDFORMAT");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORWRONGCOMMANDFORMAT);
        case DfuError::REMOTEEXTENDEDERRORUNKNOWNCOMMAND:
          static const auto fieldREMOTEEXTENDEDERRORUNKNOWNCOMMAND = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORUNKNOWNCOMMAND");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORUNKNOWNCOMMAND);
        case DfuError::REMOTEEXTENDEDERRORINITCOMMANDINVALID:
          static const auto fieldREMOTEEXTENDEDERRORINITCOMMANDINVALID = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORINITCOMMANDINVALID");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORINITCOMMANDINVALID);
        case DfuError::REMOTEEXTENDEDERRORFWVERSIONFAILURE:
          static const auto fieldREMOTEEXTENDEDERRORFWVERSIONFAILURE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORFWVERSIONFAILURE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORFWVERSIONFAILURE);
        case DfuError::REMOTEEXTENDEDERRORHWVERSIONFAILURE:
          static const auto fieldREMOTEEXTENDEDERRORHWVERSIONFAILURE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORHWVERSIONFAILURE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORHWVERSIONFAILURE);
        case DfuError::REMOTEEXTENDEDERRORSDVERSIONFAILURE:
          static const auto fieldREMOTEEXTENDEDERRORSDVERSIONFAILURE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORSDVERSIONFAILURE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORSDVERSIONFAILURE);
        case DfuError::REMOTEEXTENDEDERRORSIGNATUREMISSING:
          static const auto fieldREMOTEEXTENDEDERRORSIGNATUREMISSING = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORSIGNATUREMISSING");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORSIGNATUREMISSING);
        case DfuError::REMOTEEXTENDEDERRORWRONGHASHTYPE:
          static const auto fieldREMOTEEXTENDEDERRORWRONGHASHTYPE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORWRONGHASHTYPE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORWRONGHASHTYPE);
        case DfuError::REMOTEEXTENDEDERRORHASHFAILED:
          static const auto fieldREMOTEEXTENDEDERRORHASHFAILED = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORHASHFAILED");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORHASHFAILED);
        case DfuError::REMOTEEXTENDEDERRORWRONGSIGNATURETYPE:
          static const auto fieldREMOTEEXTENDEDERRORWRONGSIGNATURETYPE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORWRONGSIGNATURETYPE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORWRONGSIGNATURETYPE);
        case DfuError::REMOTEEXTENDEDERRORVERIFICATIONFAILED:
          static const auto fieldREMOTEEXTENDEDERRORVERIFICATIONFAILED = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORVERIFICATIONFAILED");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORVERIFICATIONFAILED);
        case DfuError::REMOTEEXTENDEDERRORINSUFFICIENTSPACE:
          static const auto fieldREMOTEEXTENDEDERRORINSUFFICIENTSPACE = clazz->getStaticField<JDfuError>("REMOTEEXTENDEDERRORINSUFFICIENTSPACE");
          return clazz->getStaticFieldValue(fieldREMOTEEXTENDEDERRORINSUFFICIENTSPACE);
        case DfuError::REMOTEBUTTONLESSDFUOPCODENOTSUPPORTED:
          static const auto fieldREMOTEBUTTONLESSDFUOPCODENOTSUPPORTED = clazz->getStaticField<JDfuError>("REMOTEBUTTONLESSDFUOPCODENOTSUPPORTED");
          return clazz->getStaticFieldValue(fieldREMOTEBUTTONLESSDFUOPCODENOTSUPPORTED);
        case DfuError::REMOTEBUTTONLESSDFUOPERATIONFAILED:
          static const auto fieldREMOTEBUTTONLESSDFUOPERATIONFAILED = clazz->getStaticField<JDfuError>("REMOTEBUTTONLESSDFUOPERATIONFAILED");
          return clazz->getStaticFieldValue(fieldREMOTEBUTTONLESSDFUOPERATIONFAILED);
        case DfuError::REMOTEBUTTONLESSDFUINVALIDADVERTISEMENTNAME:
          static const auto fieldREMOTEBUTTONLESSDFUINVALIDADVERTISEMENTNAME = clazz->getStaticField<JDfuError>("REMOTEBUTTONLESSDFUINVALIDADVERTISEMENTNAME");
          return clazz->getStaticFieldValue(fieldREMOTEBUTTONLESSDFUINVALIDADVERTISEMENTNAME);
        case DfuError::REMOTEBUTTONLESSDFUBUSY:
          static const auto fieldREMOTEBUTTONLESSDFUBUSY = clazz->getStaticField<JDfuError>("REMOTEBUTTONLESSDFUBUSY");
          return clazz->getStaticFieldValue(fieldREMOTEBUTTONLESSDFUBUSY);
        case DfuError::REMOTEBUTTONLESSDFUNOTBONDED:
          static const auto fieldREMOTEBUTTONLESSDFUNOTBONDED = clazz->getStaticField<JDfuError>("REMOTEBUTTONLESSDFUNOTBONDED");
          return clazz->getStaticFieldValue(fieldREMOTEBUTTONLESSDFUNOTBONDED);
        case DfuError::REMOTEEXPERIMENTALBUTTONLESSDFUOPCODENOTSUPPORTED:
          static const auto fieldREMOTEEXPERIMENTALBUTTONLESSDFUOPCODENOTSUPPORTED = clazz->getStaticField<JDfuError>("REMOTEEXPERIMENTALBUTTONLESSDFUOPCODENOTSUPPORTED");
          return clazz->getStaticFieldValue(fieldREMOTEEXPERIMENTALBUTTONLESSDFUOPCODENOTSUPPORTED);
        case DfuError::REMOTEEXPERIMENTALBUTTONLESSDFUOPERATIONFAILED:
          static const auto fieldREMOTEEXPERIMENTALBUTTONLESSDFUOPERATIONFAILED = clazz->getStaticField<JDfuError>("REMOTEEXPERIMENTALBUTTONLESSDFUOPERATIONFAILED");
          return clazz->getStaticFieldValue(fieldREMOTEEXPERIMENTALBUTTONLESSDFUOPERATIONFAILED);
        case DfuError::FILENOTSPECIFIED:
          static const auto fieldFILENOTSPECIFIED = clazz->getStaticField<JDfuError>("FILENOTSPECIFIED");
          return clazz->getStaticFieldValue(fieldFILENOTSPECIFIED);
        case DfuError::FILEINVALID:
          static const auto fieldFILEINVALID = clazz->getStaticField<JDfuError>("FILEINVALID");
          return clazz->getStaticFieldValue(fieldFILEINVALID);
        case DfuError::EXTENDEDINITPACKETREQUIRED:
          static const auto fieldEXTENDEDINITPACKETREQUIRED = clazz->getStaticField<JDfuError>("EXTENDEDINITPACKETREQUIRED");
          return clazz->getStaticFieldValue(fieldEXTENDEDINITPACKETREQUIRED);
        case DfuError::INITPACKETREQUIRED:
          static const auto fieldINITPACKETREQUIRED = clazz->getStaticField<JDfuError>("INITPACKETREQUIRED");
          return clazz->getStaticFieldValue(fieldINITPACKETREQUIRED);
        case DfuError::FILESIZEINVALID:
          static const auto fieldFILESIZEINVALID = clazz->getStaticField<JDfuError>("FILESIZEINVALID");
          return clazz->getStaticFieldValue(fieldFILESIZEINVALID);
        case DfuError::FILETYPEUNSUPPORTED:
          static const auto fieldFILETYPEUNSUPPORTED = clazz->getStaticField<JDfuError>("FILETYPEUNSUPPORTED");
          return clazz->getStaticFieldValue(fieldFILETYPEUNSUPPORTED);
        case DfuError::FILEIOERROR:
          static const auto fieldFILEIOERROR = clazz->getStaticField<JDfuError>("FILEIOERROR");
          return clazz->getStaticFieldValue(fieldFILEIOERROR);
        case DfuError::FAILEDTOCONNECT:
          static const auto fieldFAILEDTOCONNECT = clazz->getStaticField<JDfuError>("FAILEDTOCONNECT");
          return clazz->getStaticFieldValue(fieldFAILEDTOCONNECT);
        case DfuError::DEVICEDISCONNECTED:
          static const auto fieldDEVICEDISCONNECTED = clazz->getStaticField<JDfuError>("DEVICEDISCONNECTED");
          return clazz->getStaticFieldValue(fieldDEVICEDISCONNECTED);
        case DfuError::BLUETOOTHDISABLED:
          static const auto fieldBLUETOOTHDISABLED = clazz->getStaticField<JDfuError>("BLUETOOTHDISABLED");
          return clazz->getStaticFieldValue(fieldBLUETOOTHDISABLED);
        case DfuError::DEVICENOTBONDED:
          static const auto fieldDEVICENOTBONDED = clazz->getStaticField<JDfuError>("DEVICENOTBONDED");
          return clazz->getStaticFieldValue(fieldDEVICENOTBONDED);
        case DfuError::SERVICEDISCOVERYFAILED:
          static const auto fieldSERVICEDISCOVERYFAILED = clazz->getStaticField<JDfuError>("SERVICEDISCOVERYFAILED");
          return clazz->getStaticFieldValue(fieldSERVICEDISCOVERYFAILED);
        case DfuError::DEVICENOTSUPPORTED:
          static const auto fieldDEVICENOTSUPPORTED = clazz->getStaticField<JDfuError>("DEVICENOTSUPPORTED");
          return clazz->getStaticFieldValue(fieldDEVICENOTSUPPORTED);
        case DfuError::READINGVERSIONFAILED:
          static const auto fieldREADINGVERSIONFAILED = clazz->getStaticField<JDfuError>("READINGVERSIONFAILED");
          return clazz->getStaticFieldValue(fieldREADINGVERSIONFAILED);
        case DfuError::ENABLINGCONTROLPOINTFAILED:
          static const auto fieldENABLINGCONTROLPOINTFAILED = clazz->getStaticField<JDfuError>("ENABLINGCONTROLPOINTFAILED");
          return clazz->getStaticFieldValue(fieldENABLINGCONTROLPOINTFAILED);
        case DfuError::WRITINGCHARACTERISTICFAILED:
          static const auto fieldWRITINGCHARACTERISTICFAILED = clazz->getStaticField<JDfuError>("WRITINGCHARACTERISTICFAILED");
          return clazz->getStaticFieldValue(fieldWRITINGCHARACTERISTICFAILED);
        case DfuError::RECEIVINGNOTIFICATIONFAILED:
          static const auto fieldRECEIVINGNOTIFICATIONFAILED = clazz->getStaticField<JDfuError>("RECEIVINGNOTIFICATIONFAILED");
          return clazz->getStaticFieldValue(fieldRECEIVINGNOTIFICATIONFAILED);
        case DfuError::UNSUPPORTEDRESPONSE:
          static const auto fieldUNSUPPORTEDRESPONSE = clazz->getStaticField<JDfuError>("UNSUPPORTEDRESPONSE");
          return clazz->getStaticFieldValue(fieldUNSUPPORTEDRESPONSE);
        case DfuError::BYTESLOST:
          static const auto fieldBYTESLOST = clazz->getStaticField<JDfuError>("BYTESLOST");
          return clazz->getStaticFieldValue(fieldBYTESLOST);
        case DfuError::CRCERROR:
          static const auto fieldCRCERROR = clazz->getStaticField<JDfuError>("CRCERROR");
          return clazz->getStaticFieldValue(fieldCRCERROR);
        case DfuError::INVALIDINTERNALSTATE:
          static const auto fieldINVALIDINTERNALSTATE = clazz->getStaticField<JDfuError>("INVALIDINTERNALSTATE");
          return clazz->getStaticFieldValue(fieldINVALIDINTERNALSTATE);
        default:
          std::string stringValue = std::to_string(static_cast<int>(value));
          throw std::invalid_argument("Invalid enum value (" + stringValue + "!");
      }
    }
  };

} // namespace margelo::nitro::co::zyke::dfu
