/**
 * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
 *
 * Do not edit this file as changes may cause incorrect behavior and will be lost
 * once the code is regenerated.
 *
 * @generated by codegen project: GenerateModuleObjCpp
 *
 * We create an umbrella header (and corresponding implementation) here since
 * Cxx compilation in BUCK has a limitation: source-code producing genrule()s
 * must have a single output. More files => more genrule()s => slower builds.
 */

#ifndef __cplusplus
#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm.
#endif

// Avoid multiple includes of RNOpentokReactNativeSpec symbols
#ifndef RNOpentokReactNativeSpec_H
#define RNOpentokReactNativeSpec_H

#import <Foundation/Foundation.h>
#import <RCTRequired/RCTRequired.h>
#import <RCTTypeSafety/RCTConvertHelpers.h>
#import <RCTTypeSafety/RCTTypedModuleConstants.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTCxxConvert.h>
#import <React/RCTManagedPointer.h>
#import <ReactCommon/RCTTurboModule.h>
#import <optional>
#import <vector>


NS_ASSUME_NONNULL_BEGIN
namespace JS {
  namespace NativeOpentok {
    struct IceConfigCustomServersElement {
      facebook::react::LazyVector<NSString *> urls() const;
      NSString *username() const;
      NSString *credential() const;

      IceConfigCustomServersElement(NSDictionary *const v) : _v(v) {}
    private:
      NSDictionary *_v;
    };
  }
}

@interface RCTCxxConvert (NativeOpentok_IceConfigCustomServersElement)
+ (RCTManagedPointer *)JS_NativeOpentok_IceConfigCustomServersElement:(id)json;
@end
namespace JS {
  namespace NativeOpentok {
    struct IceConfig {
      NSString *includeServers() const;
      NSString *transportPolicy() const;
      bool filterOutLanCandidates() const;
      facebook::react::LazyVector<JS::NativeOpentok::IceConfigCustomServersElement> customServers() const;

      IceConfig(NSDictionary *const v) : _v(v) {}
    private:
      NSDictionary *_v;
    };
  }
}

@interface RCTCxxConvert (NativeOpentok_IceConfig)
+ (RCTManagedPointer *)JS_NativeOpentok_IceConfig:(id)json;
@end
namespace JS {
  namespace NativeOpentok {
    struct SessionOptions {
      NSString *androidZOrder() const;
      NSString *apiUrl() const;
      std::optional<bool> connectionEventsSuppressed() const;
      std::optional<bool> enableStereoOutput() const;
      std::optional<bool> enableSinglePeerConnection() const;
      std::optional<bool> sessionMigration() const;
      std::optional<JS::NativeOpentok::IceConfig> iceConfig() const;
      std::optional<bool> ipWhitelist() const;
      std::optional<bool> isCamera2Capable() const;
      NSString *proxyUrl() const;
      std::optional<bool> useTextureViews() const;

      SessionOptions(NSDictionary *const v) : _v(v) {}
    private:
      NSDictionary *_v;
    };
  }
}

@interface RCTCxxConvert (NativeOpentok_SessionOptions)
+ (RCTManagedPointer *)JS_NativeOpentok_SessionOptions:(id)json;
@end
@protocol NativeOpentokSpec <RCTBridgeModule, RCTTurboModule>

- (void)initSession:(NSString *)apiKey
          sessionId:(NSString *)sessionId
            options:(JS::NativeOpentok::SessionOptions &)options;
- (void)connect:(NSString *)sessionId
          token:(NSString *)token
        resolve:(RCTPromiseResolveBlock)resolve
         reject:(RCTPromiseRejectBlock)reject;
- (void)disconnect:(NSString *)sessionId
           resolve:(RCTPromiseResolveBlock)resolve
            reject:(RCTPromiseRejectBlock)reject;
- (void)getSubscriberRtcStatsReport:(NSString *)sessionId;
- (void)getPublisherRtcStatsReport:(NSString *)sessionId
                       publisherId:(NSString *)publisherId;
- (void)setAudioTransformers:(NSString *)sessionId
                 publisherId:(NSString *)publisherId
                transformers:(NSArray *)transformers;
- (void)setVideoTransformers:(NSString *)sessionId
                 publisherId:(NSString *)publisherId
                transformers:(NSArray *)transformers;
- (void)publish:(NSString *)sessionId
    publisherId:(NSString *)publisherId;
- (void)unpublish:(NSString *)sessionId
      publisherId:(NSString *)publisherId;
- (void)removeSubscriber:(NSString *)sessionId
                streamId:(NSString *)streamId;
- (void)sendSignal:(NSString *)sessionId
              type:(NSString *)type
              data:(NSString *)data
                to:(NSString *)to;
- (void)setEncryptionSecret:(NSString *)sessionId
                     secret:(NSString *)secret
                    resolve:(RCTPromiseResolveBlock)resolve
                     reject:(RCTPromiseRejectBlock)reject;
- (void)getCapabilities:(NSString *)sessionId
                resolve:(RCTPromiseResolveBlock)resolve
                 reject:(RCTPromiseRejectBlock)reject;
- (void)reportIssue:(NSString *)sessionId
            resolve:(RCTPromiseResolveBlock)resolve
             reject:(RCTPromiseRejectBlock)reject;
- (void)forceMuteAll:(NSString *)sessionId
   excludedStreamIds:(NSArray *)excludedStreamIds
             resolve:(RCTPromiseResolveBlock)resolve
              reject:(RCTPromiseRejectBlock)reject;
- (void)forceMuteStream:(NSString *)sessionId
               streamId:(NSString *)streamId
                resolve:(RCTPromiseResolveBlock)resolve
                 reject:(RCTPromiseRejectBlock)reject;
- (void)forceDisconnect:(NSString *)sessionId
           connectionId:(NSString *)connectionId
                resolve:(RCTPromiseResolveBlock)resolve
                 reject:(RCTPromiseRejectBlock)reject;
- (void)disableForceMute:(NSString *)sessionId
                 resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject;

@end

@interface NativeOpentokSpecBase : NSObject {
@protected
facebook::react::EventEmitterCallback _eventEmitterCallback;
}
- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper;

- (void)emitOnArchiveStarted:(NSDictionary *)value;
- (void)emitOnArchiveStopped:(NSDictionary *)value;
- (void)emitOnConnectionCreated:(NSDictionary *)value;
- (void)emitOnConnectionDestroyed:(NSDictionary *)value;
- (void)emitOnMuteForced:(NSDictionary *)value;
- (void)emitOnSessionConnected:(NSDictionary *)value;
- (void)emitOnSessionDisconnected:(NSDictionary *)value;
- (void)emitOnSessionReconnecting:(NSDictionary *)value;
- (void)emitOnSessionReconnected:(NSDictionary *)value;
- (void)emitOnStreamCreated:(NSDictionary *)value;
- (void)emitOnStreamDestroyed:(NSDictionary *)value;
- (void)emitOnStreamPropertyChanged:(NSDictionary *)value;
- (void)emitOnSignalReceived:(NSDictionary *)value;
- (void)emitOnSessionError:(NSDictionary *)value;
@end

namespace facebook::react {
  /**
   * ObjC++ class for module 'NativeOpentok'
   */
  class JSI_EXPORT NativeOpentokSpecJSI : public ObjCTurboModule {
  public:
    NativeOpentokSpecJSI(const ObjCTurboModule::InitParams &params);
  };
} // namespace facebook::react
inline facebook::react::LazyVector<NSString *> JS::NativeOpentok::IceConfigCustomServersElement::urls() const
{
  id const p = _v[@"urls"];
  return RCTBridgingToVec(p, ^NSString *(id itemValue_0) { return RCTBridgingToString(itemValue_0); });
}
inline NSString *JS::NativeOpentok::IceConfigCustomServersElement::username() const
{
  id const p = _v[@"username"];
  return RCTBridgingToOptionalString(p);
}
inline NSString *JS::NativeOpentok::IceConfigCustomServersElement::credential() const
{
  id const p = _v[@"credential"];
  return RCTBridgingToOptionalString(p);
}
inline NSString *JS::NativeOpentok::IceConfig::includeServers() const
{
  id const p = _v[@"includeServers"];
  return RCTBridgingToString(p);
}
inline NSString *JS::NativeOpentok::IceConfig::transportPolicy() const
{
  id const p = _v[@"transportPolicy"];
  return RCTBridgingToString(p);
}
inline bool JS::NativeOpentok::IceConfig::filterOutLanCandidates() const
{
  id const p = _v[@"filterOutLanCandidates"];
  return RCTBridgingToBool(p);
}
inline facebook::react::LazyVector<JS::NativeOpentok::IceConfigCustomServersElement> JS::NativeOpentok::IceConfig::customServers() const
{
  id const p = _v[@"customServers"];
  return RCTBridgingToVec(p, ^JS::NativeOpentok::IceConfigCustomServersElement(id itemValue_0) { return JS::NativeOpentok::IceConfigCustomServersElement(itemValue_0); });
}
inline NSString *JS::NativeOpentok::SessionOptions::androidZOrder() const
{
  id const p = _v[@"androidZOrder"];
  return RCTBridgingToOptionalString(p);
}
inline NSString *JS::NativeOpentok::SessionOptions::apiUrl() const
{
  id const p = _v[@"apiUrl"];
  return RCTBridgingToOptionalString(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::connectionEventsSuppressed() const
{
  id const p = _v[@"connectionEventsSuppressed"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::enableStereoOutput() const
{
  id const p = _v[@"enableStereoOutput"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::enableSinglePeerConnection() const
{
  id const p = _v[@"enableSinglePeerConnection"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::sessionMigration() const
{
  id const p = _v[@"sessionMigration"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<JS::NativeOpentok::IceConfig> JS::NativeOpentok::SessionOptions::iceConfig() const
{
  id const p = _v[@"iceConfig"];
  return (p == nil ? std::nullopt : std::make_optional(JS::NativeOpentok::IceConfig(p)));
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::ipWhitelist() const
{
  id const p = _v[@"ipWhitelist"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::isCamera2Capable() const
{
  id const p = _v[@"isCamera2Capable"];
  return RCTBridgingToOptionalBool(p);
}
inline NSString *JS::NativeOpentok::SessionOptions::proxyUrl() const
{
  id const p = _v[@"proxyUrl"];
  return RCTBridgingToOptionalString(p);
}
inline std::optional<bool> JS::NativeOpentok::SessionOptions::useTextureViews() const
{
  id const p = _v[@"useTextureViews"];
  return RCTBridgingToOptionalBool(p);
}
NS_ASSUME_NONNULL_END
#endif // RNOpentokReactNativeSpec_H
