//
//  AirbridgeJSONSwizzler.swift
//  AirbridgeQA
//
//  Created by ab180 on 3/4/25.
//

import Foundation
import ObjectiveC.runtime
import Airbridge
import AirbridgeQALibrary

@objc(AirbridgeJSONSwizzler_Swift)
public class AirbridgeJSONSwizzler: NSObject {

  @objc
  public static var sdkConfiguration: SDKConfiguration?
  
  @objc public static var appName: String = "qaabr"
  @objc public static var appToken: String = "fe67302f822445d98591566d5fae1293"
  
  @objc
  public static func swizzleLoadAirbridgeJSON() {
    // airbridge instance 의 configuration 을 가져온다.
    // paramter key 가 appName 이지만, 주의해야 함
    sdkConfiguration = SDKConfigurationManager(appName: "airbridge").configuration
    if let config = sdkConfiguration {
        appName = config.appName
        appToken = config.appToken
    }

    guard let airbridgeJSONSwizzlerClassType = NSClassFromString("AirbridgeJSONSwizzler_Swift") else {
        NSLog("Swizzling AirbridgeJSON failed: Class not found.")
        return
    }
    
    guard let airbridgeJSONClassType = NSClassFromString("AirbridgeJSON_Swift") else {
        NSLog("Swizzling AirbridgeJSON failed: Class not found.")
        return
    }
    
    let originalSelector = NSSelectorFromString("loadAirbridgeJSON")
    let swizzledSelector = NSSelectorFromString("swizzled_loadAirbridgeJSON")
    
    guard let originalMethod = class_getClassMethod(airbridgeJSONClassType, originalSelector),
          let swizzledMethod = class_getClassMethod(airbridgeJSONSwizzlerClassType, swizzledSelector) else {
      NSLog("Swizzling AirbridgeJSON failed: Methods not found.")
      return
    }
    
    let swizzledIMP = method_getImplementation(swizzledMethod)
    method_setImplementation(originalMethod, swizzledIMP)
    NSLog("Swizzling AirbridgeJSON successfully")
  }
  
  @objc(swizzled_loadAirbridgeJSON)
  class func swizzled_loadAirbridgeJSON() -> [AnyHashable: Any]? {
    guard let configuration = sdkConfiguration else {
        NSLog("Swizzling AirbridgeJSON failed: configuration is nil.")
        return nil
    }

    var newDic = configuration.toAirbridgeJSON()
    
    // ios - 4.4.2 기준
    // configuration.toAirbridgeJSON() 에 아래 항목 누락으로 따로 추가 함.
    // trackingLinkCustomDomains
    // collectTCFDataEnabled
    // inAppPurchaseEnvironment
    newDic["trackingLinkCustomDomains"] = [
      "qaabr.dev.abr.ge",
      "qaabr.dev1.abr.ge",
      "qaabr.dev2.abr.ge",
      "qaabr.dev.airbridge.io",
      "qaabr.dev1.airbridge.io",
      "qaabr.dev2.airbridge.io",
      "qa.ab180.co",
      "qa.dev.ab180.co",
      "qa.dev1.ab180.co",
      "qa.dev2.ab180.co",
      "xn--qa--bw8n.xn--ob0bx63e.com"
    ]
    newDic["collectTCFDataEnabled"] = configuration.isCollectTCFDataEnabled
    newDic["inAppPurchaseEnvironment"] = configuration.inAppPurchaseEnvironment
    
    // ios - 4.7.0 기준
    // trackingBlocklist
    // comma seperate 를 Array 로 변환 하여 전달
    newDic["trackingBlocklist"] = configuration.trackingBlocklist
      .split(separator: ",")
      .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
    
    // ios - 4.8.0 기준
    newDic["calculateSKAdNetworkByServerEnabled"] = configuration.cvServerCalculationEnabled
    
    // ios - 4.9.0 configuration code loglevel type issue
    if let logLevel = configuration.logLevel as? AirbridgeLogLevel {
        switch logLevel {
        case .debug: newDic["logLevel"] = "debug"
        case .info: newDic["logLevel"] = "info"
        case .warning: newDic["logLevel"] = "warning"
        case .error: newDic["logLevel"] = "error"
        default: break
        }
    }

    // ios - 4.9.3
    // configuration.skAdNetworkConfiguration 누락으로 따로 추가 함.
    newDic["skAdNetworkConfiguration"] = configuration.skAdNetworkConfiguration
    
    // applyToStorage 함수는 parameter 로 appname 을 입력 받는다.
    // paramter key 가 name 이지만, 주의해야 함
    configuration.applyToStorage(name: configuration.appName)

    NSLog("Swizzling AirbridgeJSON loadOption: \(newDic)")

    return newDic
  }
}
