#import <React/RCTBridgeModule.h>
@import Hackle;

@interface RCT_EXTERN_MODULE(HackleReactNativeSdk, NSObject)
RCT_EXTERN_METHOD(initialize:(NSString *)sdkKey
                  config:(NSDictionary *)config
                  user:(NSDictionary *)user
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(variationDetailSync: (nonnull NSNumber)experimentKey)

RCT_EXTERN_METHOD(variationDetail: (nonnull NSNumber)experimentKey
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(featureFlagDetailSync: (nonnull NSNumber)featureKey)

RCT_EXTERN_METHOD(featureFlagDetail: (nonnull NSNumber)featureKey
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(track: (NSDictionary *)event)

RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(getRemoteConfigStringSync:(NSString *)parameterKey
                  defaultValue:(NSString *)defaultValue)

RCT_EXTERN_METHOD(getRemoteConfigString:(NSString *)parameterKey
                  defaultValue: (NSString *)defaultValue
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(getRemoteConfigDoubleSync:(NSString *)parameterKey
                  defaultValue:(nonnull NSNumber)defaultValue)

RCT_EXTERN_METHOD(getRemoteConfigDouble:(NSString *)parameterKey
                  defaultValue:(nonnull NSNumber)defaultValue
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(getRemoteConfigBooleanSync:(NSString *)parameterKey
                  defaultValue:(nonnull NSNumber)defaultValue)

RCT_EXTERN_METHOD(getRemoteConfigBoolean:(NSString *)parameterKey
                  defaultValue:(nonnull NSNumber)defaultValue
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDeviceId)
{
    HackleApp *hackleApp = [Hackle app];
    NSString *deviceId = [hackleApp deviceId];
    return deviceId;
}

RCT_EXTERN_METHOD(getUser:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)


RCT_EXTERN_METHOD(setUser:(NSDictionary *)user
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setUserId:(NSString *)userId
                    resolve:(RCTPromiseResolveBlock)resolve
                    reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setDeviceId:(NSString *)deviceId
                  resolve: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(updateUserProperties:(NSDictionary *)operations
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(updatePushSubscriptions:(NSDictionary *)operations
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(updateSmsSubscriptions:(NSDictionary *)operations
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(updateKakaoSubscriptions:(NSDictionary *)operations
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(resetUser: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setPhoneNumber:(NSString *)phoneNumber
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(unsetPhoneNumber: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(showUserExplorer: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(hideUserExplorer: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(fetch: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setCurrentScreen:(NSDictionary *)screen
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(isInvocableString:(NSString *)command
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(bridgeInvoke:(NSString *)command
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(resolveInAppMessageClick: (BOOL)result
                 resolve:(RCTPromiseResolveBlock)resolve
                 reject:(RCTPromiseRejectBlock)reject)
RCT_EXTERN_METHOD(closeInAppMessageView: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(dismissDisplayedInAppMessageView: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)
RCT_EXTERN_METHOD(beginListening: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)
RCT_EXTERN_METHOD(endListening: (RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setOptOutTracking:(BOOL)optOut
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(isOptOutTracking:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject)

@end
