///
/// JConstraint.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 <variant>

#include "FPSConstraint.hpp"
#include "VideoStabilizationModeConstraint.hpp"
#include "PreviewStabilizationModeConstraint.hpp"
#include "ResolutionBiasConstraint.hpp"
#include "VideoDynamicRangeConstraint.hpp"
#include "PhotoHDRConstraint.hpp"
#include "PixelFormatConstraint.hpp"
#include "BinnedConstraint.hpp"
#include <variant>
#include "JFPSConstraint.hpp"
#include "JVideoStabilizationModeConstraint.hpp"
#include "TargetStabilizationMode.hpp"
#include "JTargetStabilizationMode.hpp"
#include "JPreviewStabilizationModeConstraint.hpp"
#include "JResolutionBiasConstraint.hpp"
#include <memory>
#include "HybridCameraOutputSpec.hpp"
#include "JHybridCameraOutputSpec.hpp"
#include "JVideoDynamicRangeConstraint.hpp"
#include "TargetDynamicRange.hpp"
#include "JTargetDynamicRange.hpp"
#include "TargetDynamicRangeBitDepth.hpp"
#include "JTargetDynamicRangeBitDepth.hpp"
#include "TargetColorSpace.hpp"
#include "JTargetColorSpace.hpp"
#include "TargetColorRange.hpp"
#include "JTargetColorRange.hpp"
#include "JPhotoHDRConstraint.hpp"
#include "JPixelFormatConstraint.hpp"
#include "PixelFormat.hpp"
#include "JPixelFormat.hpp"
#include "JBinnedConstraint.hpp"

namespace margelo::nitro::camera {

  using namespace facebook;

  /**
   * The C++ JNI bridge between the C++ std::variant and the Java class "Constraint".
   */
  class JConstraint: public jni::JavaClass<JConstraint> {
  public:
    static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint;";

    static jni::local_ref<JConstraint> create_0(jni::alias_ref<JFPSConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JFPSConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_1(jni::alias_ref<JVideoStabilizationModeConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JVideoStabilizationModeConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_2(jni::alias_ref<JPreviewStabilizationModeConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JPreviewStabilizationModeConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_3(jni::alias_ref<JResolutionBiasConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JResolutionBiasConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_4(jni::alias_ref<JVideoDynamicRangeConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JVideoDynamicRangeConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_5(jni::alias_ref<JPhotoHDRConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JPhotoHDRConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_6(jni::alias_ref<JPixelFormatConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JPixelFormatConstraint>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JConstraint> create_7(jni::alias_ref<JBinnedConstraint> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JConstraint(jni::alias_ref<JBinnedConstraint>)>("create");
      return method(javaClassStatic(), value);
    }

    static jni::local_ref<JConstraint> fromCpp(const std::variant<FPSConstraint, VideoStabilizationModeConstraint, PreviewStabilizationModeConstraint, ResolutionBiasConstraint, VideoDynamicRangeConstraint, PhotoHDRConstraint, PixelFormatConstraint, BinnedConstraint>& variant) {
      switch (variant.index()) {
        case 0: return create_0(JFPSConstraint::fromCpp(std::get<0>(variant)));
        case 1: return create_1(JVideoStabilizationModeConstraint::fromCpp(std::get<1>(variant)));
        case 2: return create_2(JPreviewStabilizationModeConstraint::fromCpp(std::get<2>(variant)));
        case 3: return create_3(JResolutionBiasConstraint::fromCpp(std::get<3>(variant)));
        case 4: return create_4(JVideoDynamicRangeConstraint::fromCpp(std::get<4>(variant)));
        case 5: return create_5(JPhotoHDRConstraint::fromCpp(std::get<5>(variant)));
        case 6: return create_6(JPixelFormatConstraint::fromCpp(std::get<6>(variant)));
        case 7: return create_7(JBinnedConstraint::fromCpp(std::get<7>(variant)));
        default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")");
      }
    }

    [[nodiscard]] std::variant<FPSConstraint, VideoStabilizationModeConstraint, PreviewStabilizationModeConstraint, ResolutionBiasConstraint, VideoDynamicRangeConstraint, PhotoHDRConstraint, PixelFormatConstraint, BinnedConstraint> toCpp() const;
  };

  namespace JConstraint_impl {
    class First final: public jni::JavaClass<First, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$First;";
    
      [[nodiscard]] jni::local_ref<JFPSConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JFPSConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Second final: public jni::JavaClass<Second, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Second;";
    
      [[nodiscard]] jni::local_ref<JVideoStabilizationModeConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JVideoStabilizationModeConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Third final: public jni::JavaClass<Third, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Third;";
    
      [[nodiscard]] jni::local_ref<JPreviewStabilizationModeConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JPreviewStabilizationModeConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Fourth final: public jni::JavaClass<Fourth, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Fourth;";
    
      [[nodiscard]] jni::local_ref<JResolutionBiasConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JResolutionBiasConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Fifth final: public jni::JavaClass<Fifth, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Fifth;";
    
      [[nodiscard]] jni::local_ref<JVideoDynamicRangeConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JVideoDynamicRangeConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Sixth final: public jni::JavaClass<Sixth, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Sixth;";
    
      [[nodiscard]] jni::local_ref<JPhotoHDRConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JPhotoHDRConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Seventh final: public jni::JavaClass<Seventh, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Seventh;";
    
      [[nodiscard]] jni::local_ref<JPixelFormatConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JPixelFormatConstraint>("value");
        return getFieldValue(field);
      }
    };
    
    class Eigth final: public jni::JavaClass<Eigth, JConstraint> {
    public:
      static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Constraint$Eigth;";
    
      [[nodiscard]] jni::local_ref<JBinnedConstraint> getValue() const {
        static const auto field = javaClassStatic()->getField<JBinnedConstraint>("value");
        return getFieldValue(field);
      }
    };
  } // namespace JConstraint_impl
} // namespace margelo::nitro::camera
