// Auto generated by Craby. DO NOT EDIT.
#pragma once

#include "CrabyUtils.hpp"
#include "ffi.rs.h"
#include <ReactCommon/TurboModule.h>
#include <jsi/jsi.h>
#include <memory>

namespace craby {
namespace hwpjs {
namespace modules {

class JSI_EXPORT CxxHwpjsModule : public facebook::react::TurboModule {
public:
  static constexpr const char *kModuleName = "Hwpjs";
  static std::string dataPath;

  CxxHwpjsModule(std::shared_ptr<facebook::react::CallInvoker> jsInvoker);
  ~CxxHwpjsModule();

  void invalidate();
  static facebook::jsi::Value
  fileHeader(facebook::jsi::Runtime &rt,
      facebook::react::TurboModule &turboModule,
      const facebook::jsi::Value args[], size_t count);

  static facebook::jsi::Value
  toJson(facebook::jsi::Runtime &rt,
      facebook::react::TurboModule &turboModule,
      const facebook::jsi::Value args[], size_t count);

  static facebook::jsi::Value
  toMarkdown(facebook::jsi::Runtime &rt,
      facebook::react::TurboModule &turboModule,
      const facebook::jsi::Value args[], size_t count);

protected:
  std::shared_ptr<facebook::react::CallInvoker> callInvoker_;
  std::shared_ptr<craby::hwpjs::bridging::Hwpjs> module_;
  std::atomic<bool> invalidated_{false};
  std::atomic<size_t> nextListenerId_{0};
  std::mutex listenersMutex_;
  std::unordered_map<
    std::string,
    std::unordered_map<size_t, std::shared_ptr<facebook::jsi::Function>>>
    listenersMap_;
  std::shared_ptr<craby::hwpjs::utils::ThreadPool> threadPool_;
};

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