///
/// JWK.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#pragma once

#if __has_include(<NitroModules/JSIConverter.hpp>)
#include <NitroModules/JSIConverter.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif
#if __has_include(<NitroModules/NitroDefines.hpp>)
#include <NitroModules/NitroDefines.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif
#if __has_include(<NitroModules/JSIHelpers.hpp>)
#include <NitroModules/JSIHelpers.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif
#if __has_include(<NitroModules/PropNameIDCache.hpp>)
#include <NitroModules/PropNameIDCache.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif

// Forward declaration of `JWKkty` to properly resolve imports.
namespace margelo::nitro::crypto { enum class JWKkty; }
// Forward declaration of `JWKuse` to properly resolve imports.
namespace margelo::nitro::crypto { enum class JWKuse; }
// Forward declaration of `KeyUsage` to properly resolve imports.
namespace margelo::nitro::crypto { enum class KeyUsage; }

#include "JWKkty.hpp"
#include <optional>
#include "JWKuse.hpp"
#include "KeyUsage.hpp"
#include <vector>
#include <string>

namespace margelo::nitro::crypto {

  /**
   * A struct which can be represented as a JavaScript object (JWK).
   */
  struct JWK final {
  public:
    std::optional<JWKkty> kty     SWIFT_PRIVATE;
    std::optional<JWKuse> use     SWIFT_PRIVATE;
    std::optional<std::vector<KeyUsage>> key_ops     SWIFT_PRIVATE;
    std::optional<std::string> alg     SWIFT_PRIVATE;
    std::optional<std::string> crv     SWIFT_PRIVATE;
    std::optional<std::string> kid     SWIFT_PRIVATE;
    std::optional<std::string> x5u     SWIFT_PRIVATE;
    std::optional<std::vector<std::string>> x5c     SWIFT_PRIVATE;
    std::optional<std::string> x5t     SWIFT_PRIVATE;
    std::optional<std::string> x5t_256     SWIFT_PRIVATE;
    std::optional<std::string> n     SWIFT_PRIVATE;
    std::optional<std::string> e     SWIFT_PRIVATE;
    std::optional<std::string> d     SWIFT_PRIVATE;
    std::optional<std::string> p     SWIFT_PRIVATE;
    std::optional<std::string> q     SWIFT_PRIVATE;
    std::optional<std::string> x     SWIFT_PRIVATE;
    std::optional<std::string> y     SWIFT_PRIVATE;
    std::optional<std::string> k     SWIFT_PRIVATE;
    std::optional<std::string> dp     SWIFT_PRIVATE;
    std::optional<std::string> dq     SWIFT_PRIVATE;
    std::optional<std::string> qi     SWIFT_PRIVATE;
    std::optional<std::string> pub     SWIFT_PRIVATE;
    std::optional<std::string> priv     SWIFT_PRIVATE;
    std::optional<bool> ext     SWIFT_PRIVATE;

  public:
    JWK() = default;
    explicit JWK(std::optional<JWKkty> kty, std::optional<JWKuse> use, std::optional<std::vector<KeyUsage>> key_ops, std::optional<std::string> alg, std::optional<std::string> crv, std::optional<std::string> kid, std::optional<std::string> x5u, std::optional<std::vector<std::string>> x5c, std::optional<std::string> x5t, std::optional<std::string> x5t_256, std::optional<std::string> n, std::optional<std::string> e, std::optional<std::string> d, std::optional<std::string> p, std::optional<std::string> q, std::optional<std::string> x, std::optional<std::string> y, std::optional<std::string> k, std::optional<std::string> dp, std::optional<std::string> dq, std::optional<std::string> qi, std::optional<std::string> pub, std::optional<std::string> priv, std::optional<bool> ext): kty(kty), use(use), key_ops(key_ops), alg(alg), crv(crv), kid(kid), x5u(x5u), x5c(x5c), x5t(x5t), x5t_256(x5t_256), n(n), e(e), d(d), p(p), q(q), x(x), y(y), k(k), dp(dp), dq(dq), qi(qi), pub(pub), priv(priv), ext(ext) {}

  public:
    friend bool operator==(const JWK& lhs, const JWK& rhs) = default;
  };

} // namespace margelo::nitro::crypto

namespace margelo::nitro {

  // C++ JWK <> JS JWK (object)
  template <>
  struct JSIConverter<margelo::nitro::crypto::JWK> final {
    static inline margelo::nitro::crypto::JWK fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
      jsi::Object obj = arg.asObject(runtime);
      return margelo::nitro::crypto::JWK(
        JSIConverter<std::optional<margelo::nitro::crypto::JWKkty>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "kty"))),
        JSIConverter<std::optional<margelo::nitro::crypto::JWKuse>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "use"))),
        JSIConverter<std::optional<std::vector<margelo::nitro::crypto::KeyUsage>>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "key_ops"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "alg"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "crv"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "kid"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5u"))),
        JSIConverter<std::optional<std::vector<std::string>>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5c"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5t"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5t#256"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "n"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "e"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "d"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "p"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "q"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "y"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "k"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "dp"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "dq"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "qi"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "pub"))),
        JSIConverter<std::optional<std::string>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priv"))),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "ext")))
      );
    }
    static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::crypto::JWK& arg) {
      jsi::Object obj(runtime);
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "kty"), JSIConverter<std::optional<margelo::nitro::crypto::JWKkty>>::toJSI(runtime, arg.kty));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "use"), JSIConverter<std::optional<margelo::nitro::crypto::JWKuse>>::toJSI(runtime, arg.use));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "key_ops"), JSIConverter<std::optional<std::vector<margelo::nitro::crypto::KeyUsage>>>::toJSI(runtime, arg.key_ops));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "alg"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.alg));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "crv"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.crv));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "kid"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.kid));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "x5u"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.x5u));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "x5c"), JSIConverter<std::optional<std::vector<std::string>>>::toJSI(runtime, arg.x5c));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "x5t"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.x5t));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "x5t#256"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.x5t_256));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "n"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.n));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "e"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.e));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "d"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.d));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "p"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.p));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "q"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.q));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "x"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.x));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "y"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.y));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "k"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.k));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "dp"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.dp));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "dq"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.dq));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "qi"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.qi));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "pub"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.pub));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "priv"), JSIConverter<std::optional<std::string>>::toJSI(runtime, arg.priv));
      obj.setProperty(runtime, PropNameIDCache::get(runtime, "ext"), JSIConverter<std::optional<bool>>::toJSI(runtime, arg.ext));
      return obj;
    }
    static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
      if (!value.isObject()) {
        return false;
      }
      jsi::Object obj = value.getObject(runtime);
      if (!nitro::isPlainObject(runtime, obj)) {
        return false;
      }
      if (!JSIConverter<std::optional<margelo::nitro::crypto::JWKkty>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "kty")))) return false;
      if (!JSIConverter<std::optional<margelo::nitro::crypto::JWKuse>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "use")))) return false;
      if (!JSIConverter<std::optional<std::vector<margelo::nitro::crypto::KeyUsage>>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "key_ops")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "alg")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "crv")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "kid")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5u")))) return false;
      if (!JSIConverter<std::optional<std::vector<std::string>>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5c")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5t")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x5t#256")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "n")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "e")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "d")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "p")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "q")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "x")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "y")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "k")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "dp")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "dq")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "qi")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "pub")))) return false;
      if (!JSIConverter<std::optional<std::string>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priv")))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "ext")))) return false;
      return true;
    }
  };

} // namespace margelo::nitro
