#pragma once

#include "QtWidgets/QWidget/qwidget_macro.h"
#include "QtWidgets/QWidget/qwidget_wrap.h"

/*

    This macro adds common QAbstractSpinBox exported methods
    The exported methods are taken into this macro to avoid writing them in each
   and every widget we export.
 */

#ifndef QABSTRACTSPINBOX_WRAPPED_METHODS_DECLARATION
#define QABSTRACTSPINBOX_WRAPPED_METHODS_DECLARATION      \
  QWIDGET_WRAPPED_METHODS_DECLARATION                     \
  Napi::Value selectAll(const Napi::CallbackInfo& info) { \
    Napi::Env env = info.Env();                           \
    this->instance->selectAll();                          \
    return env.Null();                                    \
  }                                                       \
  Napi::Value stepDown(const Napi::CallbackInfo& info) {  \
    Napi::Env env = info.Env();                           \
    this->instance->stepDown();                           \
    return env.Null();                                    \
  }                                                       \
  Napi::Value stepUp(const Napi::CallbackInfo& info) {    \
    Napi::Env env = info.Env();                           \
    this->instance->stepUp();                             \
    return env.Null();                                    \
  }

#endif  // QABSTRACTSPINBOX_WRAPPED_METHODS_DECLARATION

#ifndef QABSTRACTSPINBOX_WRAPPED_METHODS_EXPORT_DEFINE
#define QABSTRACTSPINBOX_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
  QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName)                \
  InstanceMethod("selectAll", &WidgetWrapName::selectAll),             \
      InstanceMethod("stepDown", &WidgetWrapName::stepDown),           \
      InstanceMethod("stepUp", &WidgetWrapName::stepUp),

#endif  // QABSTRACTSPINBOX_WRAPPED_METHODS_EXPORT_DEFINE

#ifndef QABSTRACTSPINBOX_SIGNALS
#define QABSTRACTSPINBOX_SIGNALS                                        \
  QWIDGET_SIGNALS                                                       \
  QObject::connect(this, &QAbstractSpinBox::editingFinished, [=]() {    \
    Napi::Env env = this->emitOnNode.Env();                             \
    Napi::HandleScope scope(env);                                       \
    this->emitOnNode.Call({Napi::String::New(env, "editingFinished")}); \
  });

#endif  // QABSTRACTSPINBOX_SIGNALS
