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

#pragma once

#if __has_include(<NitroModules/NitroHash.hpp>)
#include <NitroModules/NitroHash.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif
#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

namespace margelo::nitro::multipleimagepicker {

  /**
   * An enum which can be represented as a JavaScript union (Language).
   */
  enum class Language {
    SYSTEM      SWIFT_NAME(system) = 0,
    ZH_HANS      SWIFT_NAME(zhHans) = 1,
    ZH_HANT      SWIFT_NAME(zhHant) = 2,
    JA      SWIFT_NAME(ja) = 3,
    KO      SWIFT_NAME(ko) = 4,
    EN      SWIFT_NAME(en) = 5,
    TH      SWIFT_NAME(th) = 6,
    ID      SWIFT_NAME(id) = 7,
    VI      SWIFT_NAME(vi) = 8,
    RU      SWIFT_NAME(ru) = 9,
    DE      SWIFT_NAME(de) = 10,
    FR      SWIFT_NAME(fr) = 11,
    AR      SWIFT_NAME(ar) = 12,
  } CLOSED_ENUM;

} // namespace margelo::nitro::multipleimagepicker

namespace margelo::nitro {

  using namespace margelo::nitro::multipleimagepicker;

  // C++ Language <> JS Language (union)
  template <>
  struct JSIConverter<Language> final {
    static inline Language fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
      std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, arg);
      switch (hashString(unionValue.c_str(), unionValue.size())) {
        case hashString("system"): return Language::SYSTEM;
        case hashString("zh-Hans"): return Language::ZH_HANS;
        case hashString("zh-Hant"): return Language::ZH_HANT;
        case hashString("ja"): return Language::JA;
        case hashString("ko"): return Language::KO;
        case hashString("en"): return Language::EN;
        case hashString("th"): return Language::TH;
        case hashString("id"): return Language::ID;
        case hashString("vi"): return Language::VI;
        case hashString("ru"): return Language::RU;
        case hashString("de"): return Language::DE;
        case hashString("fr"): return Language::FR;
        case hashString("ar"): return Language::AR;
        default: [[unlikely]]
          throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum Language - invalid value!");
      }
    }
    static inline jsi::Value toJSI(jsi::Runtime& runtime, Language arg) {
      switch (arg) {
        case Language::SYSTEM: return JSIConverter<std::string>::toJSI(runtime, "system");
        case Language::ZH_HANS: return JSIConverter<std::string>::toJSI(runtime, "zh-Hans");
        case Language::ZH_HANT: return JSIConverter<std::string>::toJSI(runtime, "zh-Hant");
        case Language::JA: return JSIConverter<std::string>::toJSI(runtime, "ja");
        case Language::KO: return JSIConverter<std::string>::toJSI(runtime, "ko");
        case Language::EN: return JSIConverter<std::string>::toJSI(runtime, "en");
        case Language::TH: return JSIConverter<std::string>::toJSI(runtime, "th");
        case Language::ID: return JSIConverter<std::string>::toJSI(runtime, "id");
        case Language::VI: return JSIConverter<std::string>::toJSI(runtime, "vi");
        case Language::RU: return JSIConverter<std::string>::toJSI(runtime, "ru");
        case Language::DE: return JSIConverter<std::string>::toJSI(runtime, "de");
        case Language::FR: return JSIConverter<std::string>::toJSI(runtime, "fr");
        case Language::AR: return JSIConverter<std::string>::toJSI(runtime, "ar");
        default: [[unlikely]]
          throw std::invalid_argument("Cannot convert Language to JS - invalid value: "
                                    + std::to_string(static_cast<int>(arg)) + "!");
      }
    }
    static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
      if (!value.isString()) {
        return false;
      }
      std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, value);
      switch (hashString(unionValue.c_str(), unionValue.size())) {
        case hashString("system"):
        case hashString("zh-Hans"):
        case hashString("zh-Hant"):
        case hashString("ja"):
        case hashString("ko"):
        case hashString("en"):
        case hashString("th"):
        case hashString("id"):
        case hashString("vi"):
        case hashString("ru"):
        case hashString("de"):
        case hashString("fr"):
        case hashString("ar"):
          return true;
        default:
          return false;
      }
    }
  };

} // namespace margelo::nitro
