///
/// AndroidHaptics.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::haptics {

  /**
   * An enum which can be represented as a JavaScript union (AndroidHaptics).
   */
  enum class AndroidHaptics {
    CONFIRM      SWIFT_NAME(confirm) = 0,
    REJECT      SWIFT_NAME(reject) = 1,
    GESTURE_START      SWIFT_NAME(gestureStart) = 2,
    GESTURE_END      SWIFT_NAME(gestureEnd) = 3,
    TOGGLE_ON      SWIFT_NAME(toggleOn) = 4,
    TOGGLE_OFF      SWIFT_NAME(toggleOff) = 5,
    CLOCK_TICK      SWIFT_NAME(clockTick) = 6,
    CONTEXT_CLICK      SWIFT_NAME(contextClick) = 7,
    DRAG_START      SWIFT_NAME(dragStart) = 8,
    KEYBOARD_TAP      SWIFT_NAME(keyboardTap) = 9,
    KEYBOARD_PRESS      SWIFT_NAME(keyboardPress) = 10,
    KEYBOARD_RELEASE      SWIFT_NAME(keyboardRelease) = 11,
    LONG_PRESS      SWIFT_NAME(longPress) = 12,
    VIRTUAL_KEY      SWIFT_NAME(virtualKey) = 13,
    VIRTUAL_KEY_RELEASE      SWIFT_NAME(virtualKeyRelease) = 14,
    NO_HAPTICS      SWIFT_NAME(noHaptics) = 15,
    SEGMENT_TICK      SWIFT_NAME(segmentTick) = 16,
    SEGMENT_FREQUENT_TICK      SWIFT_NAME(segmentFrequentTick) = 17,
    TEXT_HANDLE_MOVE      SWIFT_NAME(textHandleMove) = 18,
  } CLOSED_ENUM;

} // namespace margelo::nitro::haptics

namespace margelo::nitro {

  using namespace margelo::nitro::haptics;

  // C++ AndroidHaptics <> JS AndroidHaptics (union)
  template <>
  struct JSIConverter<AndroidHaptics> final {
    static inline AndroidHaptics 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("confirm"): return AndroidHaptics::CONFIRM;
        case hashString("reject"): return AndroidHaptics::REJECT;
        case hashString("gesture-start"): return AndroidHaptics::GESTURE_START;
        case hashString("gesture-end"): return AndroidHaptics::GESTURE_END;
        case hashString("toggle-on"): return AndroidHaptics::TOGGLE_ON;
        case hashString("toggle-off"): return AndroidHaptics::TOGGLE_OFF;
        case hashString("clock-tick"): return AndroidHaptics::CLOCK_TICK;
        case hashString("context-click"): return AndroidHaptics::CONTEXT_CLICK;
        case hashString("drag-start"): return AndroidHaptics::DRAG_START;
        case hashString("keyboard-tap"): return AndroidHaptics::KEYBOARD_TAP;
        case hashString("keyboard-press"): return AndroidHaptics::KEYBOARD_PRESS;
        case hashString("keyboard-release"): return AndroidHaptics::KEYBOARD_RELEASE;
        case hashString("long-press"): return AndroidHaptics::LONG_PRESS;
        case hashString("virtual-key"): return AndroidHaptics::VIRTUAL_KEY;
        case hashString("virtual-key-release"): return AndroidHaptics::VIRTUAL_KEY_RELEASE;
        case hashString("no-haptics"): return AndroidHaptics::NO_HAPTICS;
        case hashString("segment-tick"): return AndroidHaptics::SEGMENT_TICK;
        case hashString("segment-frequent-tick"): return AndroidHaptics::SEGMENT_FREQUENT_TICK;
        case hashString("text-handle-move"): return AndroidHaptics::TEXT_HANDLE_MOVE;
        default: [[unlikely]]
          throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum AndroidHaptics - invalid value!");
      }
    }
    static inline jsi::Value toJSI(jsi::Runtime& runtime, AndroidHaptics arg) {
      switch (arg) {
        case AndroidHaptics::CONFIRM: return JSIConverter<std::string>::toJSI(runtime, "confirm");
        case AndroidHaptics::REJECT: return JSIConverter<std::string>::toJSI(runtime, "reject");
        case AndroidHaptics::GESTURE_START: return JSIConverter<std::string>::toJSI(runtime, "gesture-start");
        case AndroidHaptics::GESTURE_END: return JSIConverter<std::string>::toJSI(runtime, "gesture-end");
        case AndroidHaptics::TOGGLE_ON: return JSIConverter<std::string>::toJSI(runtime, "toggle-on");
        case AndroidHaptics::TOGGLE_OFF: return JSIConverter<std::string>::toJSI(runtime, "toggle-off");
        case AndroidHaptics::CLOCK_TICK: return JSIConverter<std::string>::toJSI(runtime, "clock-tick");
        case AndroidHaptics::CONTEXT_CLICK: return JSIConverter<std::string>::toJSI(runtime, "context-click");
        case AndroidHaptics::DRAG_START: return JSIConverter<std::string>::toJSI(runtime, "drag-start");
        case AndroidHaptics::KEYBOARD_TAP: return JSIConverter<std::string>::toJSI(runtime, "keyboard-tap");
        case AndroidHaptics::KEYBOARD_PRESS: return JSIConverter<std::string>::toJSI(runtime, "keyboard-press");
        case AndroidHaptics::KEYBOARD_RELEASE: return JSIConverter<std::string>::toJSI(runtime, "keyboard-release");
        case AndroidHaptics::LONG_PRESS: return JSIConverter<std::string>::toJSI(runtime, "long-press");
        case AndroidHaptics::VIRTUAL_KEY: return JSIConverter<std::string>::toJSI(runtime, "virtual-key");
        case AndroidHaptics::VIRTUAL_KEY_RELEASE: return JSIConverter<std::string>::toJSI(runtime, "virtual-key-release");
        case AndroidHaptics::NO_HAPTICS: return JSIConverter<std::string>::toJSI(runtime, "no-haptics");
        case AndroidHaptics::SEGMENT_TICK: return JSIConverter<std::string>::toJSI(runtime, "segment-tick");
        case AndroidHaptics::SEGMENT_FREQUENT_TICK: return JSIConverter<std::string>::toJSI(runtime, "segment-frequent-tick");
        case AndroidHaptics::TEXT_HANDLE_MOVE: return JSIConverter<std::string>::toJSI(runtime, "text-handle-move");
        default: [[unlikely]]
          throw std::invalid_argument("Cannot convert AndroidHaptics 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("confirm"):
        case hashString("reject"):
        case hashString("gesture-start"):
        case hashString("gesture-end"):
        case hashString("toggle-on"):
        case hashString("toggle-off"):
        case hashString("clock-tick"):
        case hashString("context-click"):
        case hashString("drag-start"):
        case hashString("keyboard-tap"):
        case hashString("keyboard-press"):
        case hashString("keyboard-release"):
        case hashString("long-press"):
        case hashString("virtual-key"):
        case hashString("virtual-key-release"):
        case hashString("no-haptics"):
        case hashString("segment-tick"):
        case hashString("segment-frequent-tick"):
        case hashString("text-handle-move"):
          return true;
        default:
          return false;
      }
    }
  };

} // namespace margelo::nitro
