//
//  RNVexo.mm
//  VexoAnalytics
//
//  Created by Federico Nicoli on 6/2/23.
//  Copyright © 2023 Facebook. All rights reserved.
//
//  Compiled as Objective-C++ so the New Architecture branch can vend the
//  codegen'd TurboModule (#67). The method signatures below match the
//  generated NativeRNVexoSpec protocol exactly (numbers are doubles there);
//  on the old architecture the classic bridge handles the same selectors.

#import <Foundation/Foundation.h>
#import <React/RCTUtils.h>
#import <React/RCTUIManager.h>
#if __has_include(<React/RCTUIManagerUtils.h>)
#import <React/RCTUIManagerUtils.h>
#endif

#import "RNVexo.h"
#import <RNVexoViewShot.h>
#import <VexoAnalytics/VexoAnalytics.h>

@implementation RNVexo {
  UIBackgroundTaskIdentifier _taskId;
}

- (instancetype)init {
  self = [super init];

  return self;
}

RCT_EXPORT_MODULE();

- (dispatch_queue_t) methodQueue {
    return dispatch_queue_create("co.vexo.analytics.rn", DISPATCH_QUEUE_SERIAL);
}

+ (BOOL) requiresMainQueueSetup {
    return false;
}

RCT_EXPORT_METHOD(configureWithApiKey:(NSString*)apikey
                  deviceId:(NSString*)deviceId
                  config:(NSDictionary*)config
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  [VexoAnalytics configureWithApiKey:apikey deviceId:deviceId config:config];
  resolve(NULL);
}

RCT_EXPORT_METHOD(blurImage:(NSString *)imageBase64
                  radius:(double)radius
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  NSError *error;
  NSString *blurredImage = [VexoAnalytics blurImage:imageBase64 radius:@(radius) error:&error];
  if (!blurredImage) {
    reject(@"Blurring failed", error.localizedDescription, nil);
    return;
  }
  resolve(blurredImage);
}

RCT_EXPORT_METHOD(startBackgroundTask:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  _taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    if (!self->_taskId) {
      return;
    }
    [[UIApplication sharedApplication] endBackgroundTask: self->_taskId];
  }];
  resolve([NSNumber numberWithLong: _taskId]);
}

RCT_EXPORT_METHOD(endBackgroundTask:(double)taskId
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  [[UIApplication sharedApplication] endBackgroundTask: (UIBackgroundTaskIdentifier)taskId];
  resolve(NULL);
}

RCT_EXPORT_METHOD(startRecording:(NSString*)sessionId
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  [VexoAnalytics startRecording:sessionId];
  resolve(NULL);
}

RCT_EXPORT_METHOD(stopRecording:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
  [VexoAnalytics stopRecording];
  resolve(NULL);
}

#ifdef RCT_NEW_ARCH_ENABLED
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
    (const facebook::react::ObjCTurboModule::InitParams &)params
{
  return std::make_shared<facebook::react::NativeRNVexoSpecJSI>(params);
}
#endif

@end
