//
//  IdentifiersInteractor.swift
//  AirbridgeQA
//
//  Created by WOF on 6/24/24.
//

import React
import AdSupport

@objc(IdentifiersInteractor)
class IdentifiersInteractor: NSObject {
  
  @objc(airbridgeJSON:reject:)
  func airbridgeJSON(
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock
  ) {
    guard let classType = NSClassFromString("AirbridgeReactNative_Swift") else {
      NSLog("reflaction AirbridgeReactNative_Swift failed: Class not found.")
      resolve("")
      return
    }
    
    guard let airbridgeJSON = (classType.value(forKey: "airbridgeJSON") as? [AnyHashable: Any]) else {
      NSLog("reflaction AirbridgeReactNative_Swift failed: airbridgeJSON not found.")
      resolve("")
      return
    }
    
    resolve(String(
      data: try! JSONSerialization.data(withJSONObject: airbridgeJSON),
      encoding: .utf8
    ))
  }
  
  @objc(identifiers:reject:)
  func identifiers(
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock
  ) {
    fetch { data in
      let response: [AnyHashable: Any] = [
        "responseCode": 200,
        "data": data
      ]
      resolve(String(
        data: try! JSONSerialization.data(withJSONObject: response),
        encoding: .utf8
      ))
    }
  }
  
  func fetch(onSuccess: @escaping ([String: String?]) -> Void) {
    onSuccess([
      "idfa": ASIdentifierManager.shared().advertisingIdentifier.uuidString,
      "idfv": UIDevice.current.identifierForVendor?.uuidString
    ])
  }
  
  @objc(apnsToken:reject:)
  func apnsToken(
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock
  ) {
    let response: [AnyHashable: Any]
    if let apnsToken = APNsSetting.apns {
      response = ["responseCode": 200, "data": apnsToken]
    } else {
      response = ["responseCode": 202]
    }
    resolve(String(
      data: try! JSONSerialization.data(withJSONObject: response),
      encoding: .utf8
    ))
  }
}
