/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#pragma once

#import <memory>

#import <React/RCTCxxModule.h>
#import <jsireact/RCTTurboModule.h>

#import "NativeSampleTurboCxxModuleSpecJSI.h"

namespace facebook {
namespace react {

/**
 * A sample implementation of the C++ spec. In practice, this class can just extend jsi::HostObject
 * directly, but using the spec provides build-time type-safety.
 */
class SampleTurboCxxModule : public NativeSampleTurboCxxModuleSpecJSI {
public:
  SampleTurboCxxModule(std::shared_ptr<JSCallInvoker> jsInvoker);

  void voidFunc(jsi::Runtime &rt) override;
  bool getBool(jsi::Runtime &rt, bool arg) override;
  double getNumber(jsi::Runtime &rt, double arg) override;
  jsi::String getString(jsi::Runtime &rt, const jsi::String &arg) override;
  jsi::Array getArray(jsi::Runtime &rt, const jsi::Array &arg) override;
  jsi::Object getObject(jsi::Runtime &rt, const jsi::Object &arg) override;
  jsi::Object getValue(jsi::Runtime &rt, double x, const jsi::String &y, const jsi::Object &z) override;
  void getValueWithCallback(jsi::Runtime &rt, const jsi::Function &callback) override;
  jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) override;
  jsi::Object getConstants(jsi::Runtime &rt) override;
};

} // namespace react
} // namespace facebook

/**
 * Sample backward-compatible RCTCxxModule-based module.
 * With jsi::HostObject, this class is no longer necessary, but the system supports it for
 * backward compatibility.
 */
@interface RCTSampleTurboCxxModule_v1 : RCTCxxModule<RCTTurboModule>

@end

/**
 * Second variant of a sample backward-compatible RCTCxxModule-based module.
 */
@interface RCTSampleTurboCxxModule_v2 : RCTCxxModule<RCTTurboModule>

@end
