// Auto generated by Craby. DO NOT EDIT.
#include "CxxHwpjsModule.hpp"
#include "cxx.h"
#include "bridging-generated.hpp"
#include <react/bridging/Bridging.h>

using namespace facebook;

namespace craby {
namespace hwpjs {
namespace modules {

std::string CxxHwpjsModule::dataPath = std::string();

CxxHwpjsModule::CxxHwpjsModule(
    std::shared_ptr<react::CallInvoker> jsInvoker)
    : TurboModule(CxxHwpjsModule::kModuleName, jsInvoker) {
  // No signals
  callInvoker_ = std::move(jsInvoker);
  module_ = std::shared_ptr<craby::hwpjs::bridging::Hwpjs>(
    craby::hwpjs::bridging::createHwpjs(
      reinterpret_cast<uintptr_t>(this),
      rust::Str(dataPath.data(), dataPath.size())).into_raw(),
    [](craby::hwpjs::bridging::Hwpjs *ptr) { rust::Box<craby::hwpjs::bridging::Hwpjs>::from_raw(ptr); }
  );
  threadPool_ = std::make_shared<craby::hwpjs::utils::ThreadPool>(10);
  methodMap_["fileHeader"] = MethodMetadata{1, &CxxHwpjsModule::fileHeader};
  methodMap_["toJson"] = MethodMetadata{1, &CxxHwpjsModule::toJson};
  methodMap_["toMarkdown"] = MethodMetadata{2, &CxxHwpjsModule::toMarkdown};
}

CxxHwpjsModule::~CxxHwpjsModule() {
  invalidate();
}

void CxxHwpjsModule::invalidate() {
  if (invalidated_.exchange(true)) {
    return;
  }

  invalidated_.store(true);
  listenersMap_.clear();

  // No signals

  // Shutdown thread pool
  threadPool_->shutdown();
}

jsi::Value CxxHwpjsModule::fileHeader(jsi::Runtime &rt,
                                react::TurboModule &turboModule,
                                const jsi::Value args[],
                                size_t count) {
  auto &thisModule = static_cast<CxxHwpjsModule &>(turboModule);
  auto callInvoker = thisModule.callInvoker_;
  auto it_ = thisModule.module_;

  try {
    if (1 != count) {
      throw jsi::JSError(rt, "Expected 1 argument");
    }

    auto arg0 = react::bridging::fromJs<rust::Vec<uint8_t>>(rt, args[0], callInvoker);
    auto ret = craby::hwpjs::bridging::fileHeader(*it_, arg0);

    return react::bridging::toJs(rt, ret);
  } catch (const jsi::JSError &err) {
    throw err;
  } catch (const std::exception &err) {
    throw jsi::JSError(rt, craby::hwpjs::utils::errorMessage(err));
  }
}

jsi::Value CxxHwpjsModule::toJson(jsi::Runtime &rt,
                                react::TurboModule &turboModule,
                                const jsi::Value args[],
                                size_t count) {
  auto &thisModule = static_cast<CxxHwpjsModule &>(turboModule);
  auto callInvoker = thisModule.callInvoker_;
  auto it_ = thisModule.module_;

  try {
    if (1 != count) {
      throw jsi::JSError(rt, "Expected 1 argument");
    }

    auto arg0 = react::bridging::fromJs<rust::Vec<uint8_t>>(rt, args[0], callInvoker);
    auto ret = craby::hwpjs::bridging::toJson(*it_, arg0);

    return react::bridging::toJs(rt, ret);
  } catch (const jsi::JSError &err) {
    throw err;
  } catch (const std::exception &err) {
    throw jsi::JSError(rt, craby::hwpjs::utils::errorMessage(err));
  }
}

jsi::Value CxxHwpjsModule::toMarkdown(jsi::Runtime &rt,
                                react::TurboModule &turboModule,
                                const jsi::Value args[],
                                size_t count) {
  auto &thisModule = static_cast<CxxHwpjsModule &>(turboModule);
  auto callInvoker = thisModule.callInvoker_;
  auto it_ = thisModule.module_;

  try {
    if (2 != count) {
      throw jsi::JSError(rt, "Expected 2 arguments");
    }

    auto arg0 = react::bridging::fromJs<rust::Vec<uint8_t>>(rt, args[0], callInvoker);
    auto arg1 = react::bridging::fromJs<craby::hwpjs::bridging::ToMarkdownOptions>(rt, args[1], callInvoker);
    auto ret = craby::hwpjs::bridging::toMarkdown(*it_, arg0, arg1);

    return react::bridging::toJs(rt, ret);
  } catch (const jsi::JSError &err) {
    throw err;
  } catch (const std::exception &err) {
    throw jsi::JSError(rt, craby::hwpjs::utils::errorMessage(err));
  }
}

} // namespace modules
} // namespace hwpjs
} // namespace craby
