//
//  RCTVeLivePull.m
//  react-native-velive-pull
//
//  Created by ByteDance on 2025/10/11.
//

#ifdef RCT_NEW_ARCH_ENABLED
#import <NativeVeLivePullSpec/NativeVeLivePullSpec.h>
#endif

#import <React/RCTEventEmitter.h>
#import "VolcApiEngine/VolcEventObserver.h"
#import "RCTVeLivePull.h"
#import "VeLivePullImpl.h"
#define EVENT_NAME @"VeLivePull:onEvent"

#ifdef RCT_NEW_ARCH_ENABLED
@interface RCTVeLivePull () <NativeVeLivePullSpec>

@end
#endif 

static RCTVeLivePull *instance = nil;

@implementation RCTVeLivePull  {
  bool hasListeners;
}

+ (instancetype)shareInstance {
  return instance;
}

//@See https://stackoverflow.com/questions/50773748/difference-requiresmainqueuesetup-and-dispatch-get-main-queue
+ (BOOL)requiresMainQueueSetup {
  return YES;
}

- (dispatch_queue_t)methodQueue {
  return dispatch_get_main_queue();
}

- (instancetype) init {
  self = [super init];
  if (self) {
    instance = self;
     self.impl = [[VeLivePullImpl alloc] initWithModule: instance];
  }
  return self;
}

- (NSArray<NSString *> *)supportedEvents {
  return @[ EVENT_NAME ];
}

- (void)onEvent:(NSString *)eventName data:(id)eventData {
  NSDictionary *dic = @{@"event" : eventName, @"data" : eventData};
  [self sendEventWithName:EVENT_NAME body:dic];
}

//export api
RCT_EXPORT_MODULE(VeLivePull)

#ifdef RCT_NEW_ARCH_ENABLED

- (NSNumber *)newApiEngine {
  return [self.impl newApiEngine];
}

- (void)call:(NSString *)params 
    callback: (RCTResponseSenderBlock)callback {
  NSDictionary * args = @{@"params": params};
  [self.impl callApi:args callback:^(id _Nonnull res) {
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:res options:0 error:nil];
    NSString* jsonResult = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    callback(@[jsonResult]);
  }];
}

- (NSString *)callSync: (NSString *) params {
  NSDictionary* args = @{@"params": params};  
  NSDictionary* result = [self.impl callApiSync: args];
  //result序列化 - 将NSDictionary转换为JSON字符串
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:result options:0 error:nil];
  NSString* jsonResult = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  return jsonResult;
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
    (const facebook::react::ObjCTurboModule::InitParams &)params
 {
    return std::make_shared<facebook::react::NativeVeLivePullSpecJSI>(params);
 }

#else
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(newApiEngine) {
  return [self.impl newApiEngine];
}

RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(callApiSync
                                       : (nonnull NSDictionary *)args) {
  NSDictionary* result = [self.impl callApiSync: args];
  //result序列化 - 将NSDictionary转换为JSON字符串
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:result options:0 error:nil];
  NSString* jsonResult = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  return jsonResult;
}

RCT_EXPORT_METHOD(callApi
                  : (nonnull NSDictionary *)args callback
                  : (RCTResponseSenderBlock)callback) {
	[self.impl callApi:args callback:^(id _Nonnull res) {
  	NSData *jsonData = [NSJSONSerialization dataWithJSONObject:res options:0 error:nil];
  	NSString* jsonResult = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  	callback(@[jsonResult]);
	}];
}
#endif

@end
