//
//  AirbridgeOptionBuilderApply.swift
//  airbridge-react-native-sdk
//
//  Created by WOF on 7/24/24.
//

import Airbridge

extension AirbridgeOptionBuilder {
    func setAirbridgeJSON(_ airbridgeJSON: [AnyHashable: Any]?) -> AirbridgeOptionBuilder {
        guard let json = airbridgeJSON else { return self }
        
        if let sdkEnabled = json["sdkEnabled"] as? Bool {
            setSDKEnabled(sdkEnabled)
        }
        if let logLevel = json["logLevel"] as? String {
            switch logLevel.lowercased() {
            case "debug": setLogLevel(.debug)
            case "info": setLogLevel(.info)
            case "warning": setLogLevel(.warning)
            case "error": setLogLevel(.error)
            case "fault": setLogLevel(.fault)
            default: break
            }
        }
        if let paginateLogEnabled = json["paginateLogEnabled"] as? Bool {
            setPaginateLogEnabled(paginateLogEnabled)
        }
        if let appGroup = json["appGroup"] as? String {
            setAppGroup(appGroup)
        }
        if let autoStartTrackingEnabled = json["autoStartTrackingEnabled"] as? Bool {
            setAutoStartTrackingEnabled(autoStartTrackingEnabled)
        }
        if
            let autoDetermineTrackingAuthorizationTimeoutInSecond
                = json["autoDetermineTrackingAuthorizationTimeoutInSecond"] as? Double
        {
            setAutoDetermineTrackingAuthorizationTimeout(second: autoDetermineTrackingAuthorizationTimeoutInSecond)
        }
        if
            let trackingLinkCustomDomains = json["trackingLinkCustomDomains"] as? Array<Any>
        {
            setTrackingLinkCustomDomains(trackingLinkCustomDomains.compactMap({ $0 as? String }))
        }
        if let trackMetaDeferredAppLinkEnabled = json["trackMetaDeferredAppLinkEnabled"] as? Bool {
            setTrackMetaDeferredAppLinkEnabled(trackMetaDeferredAppLinkEnabled)
        }
        if let sessionTimeoutInSecond = json["sessionTimeoutInSecond"] as? Double {
            setSessionTimeout(second: sessionTimeoutInSecond)
        }
        if let trackAirbridgeDeeplinkOnlyEnabled = json["trackAirbridgeDeeplinkOnlyEnabled"] as? Bool {
            setTrackAirbridgeDeeplinkOnlyEnabled(trackAirbridgeDeeplinkOnlyEnabled)
        }
        if let trackInSessionLifecycleEventEnabled = json["trackInSessionLifecycleEventEnabled"] as? Bool {
            setTrackInSessionLifecycleEventEnabled(trackInSessionLifecycleEventEnabled)
        }
        if let hashUserInformationEnabled = json["hashUserInformationEnabled"] as? Bool {
            setHashUserInformationEnabled(hashUserInformationEnabled)
        }
        if
            let sdkSignatureID = json["sdkSignatureID"] as? String,
            let sdkSignatureSecret = json["sdkSignatureSecret"] as? String
        {
            setSDKSignature(id: sdkSignatureID, secret: sdkSignatureSecret)
        }
        if let clearEventBufferOnInitializeEnabled = json["clearEventBufferOnInitializeEnabled"] as? Bool {
            setClearEventBufferOnInitializeEnabled(clearEventBufferOnInitializeEnabled)
        }
        if let eventBufferCountLimit = json["eventBufferCountLimit"] as? Int {
            setEventBufferCountLimit(eventBufferCountLimit)
        }
        if let eventBufferSizeLimitInGibibyte = json["eventBufferSizeLimitInGibibyte"] as? Double {
            setEventBufferSizeLimit(gibibyte: eventBufferSizeLimitInGibibyte)
        }
        if let pauseEventTransmitOnBackgroundEnabled = json["pauseEventTransmitOnBackgroundEnabled"] as? Bool {
            setPauseEventTransmitOnBackgroundEnabled(pauseEventTransmitOnBackgroundEnabled)
        }
        if let eventTransmitIntervalInSecond = json["eventTransmitIntervalInSecond"] as? Double {
            setEventTransmitInterval(second: eventTransmitIntervalInSecond)
        }
        
        // 4.4.0
        if let inAppPurchaseEnvironment = json["inAppPurchaseEnvironment"] as? String {
            switch inAppPurchaseEnvironment.lowercased() {
            case "production":
                setInAppPurchaseEnvironment(AirbridgeInAppPurchaseEnvironment.production)
            case "sandbox":
                setInAppPurchaseEnvironment(AirbridgeInAppPurchaseEnvironment.sandbox)
            default: break
            }
        }
        if let collectTCFDataEnabled = json["collectTCFDataEnabled"] as? Bool {
            setCollectTCFDataEnabled(collectTCFDataEnabled)
        }
        
        return self
    }
}
