//
//  BSUInitializer.swift
//  UnityFramework
//
//  Created by Moin Hasan on 5/18/25.
//

import Foundation
import BlueStackSDK

@objc(BSUInitializer)
public class BSUInitializer: NSObject {
    @objc public static let sharedInstance = BSUInitializer()

    public  var isDebugModeEnabled = false
    private var isInitInProgress = false
    private var sdkInitCompletionHandler: ((Bool, NSError?) -> Void)?
    private var adaptersInitCompletionHandler: ((InitializationStatus) -> Void)?
    
    @objc
    public func prepareBlueStackSDKWithAppId(
        _ appId: String,
        withSettings settings: BSUSettings,
        withSDKCompletionHandler completionHandler: @escaping (Bool, NSError?) -> Void,
        withAdaptersInitCompletionHandler adaptersInitCompletionHandler: @escaping (InitializationStatus) -> Void
    ){
        prepareBlueStackSDK(appId, settings, completionHandler, adaptersInitCompletionHandler)
    }

    private func prepareBlueStackSDK(
        _ appId: String,
        _ settings: BSUSettings,
        _ sdkInitCompletionHandler: @escaping (Bool, NSError?) -> Void,
        _ adaptersInitCompletionHandler: @escaping (InitializationStatus) -> Void
    )
    {
        self.sdkInitCompletionHandler = sdkInitCompletionHandler
        self.adaptersInitCompletionHandler = adaptersInitCompletionHandler
        
        if BlueStack.sharedInstance().isInitialized() {
            print("BlueStack SDK is already initialized")
            self.sdkInitCompletionHandler?(true, nil)
            return
        }
        
        if !isInitInProgress {
            self.isDebugModeEnabled = settings.isDebugModeEnabled
            BlueStack.sharedInstance().setDebugMode(enabled: settings.isDebugModeEnabled)
            BlueStack.sharedInstance().initialize(appID: appId, completion: onInitialized)
            isInitInProgress = true
        }
    }
    
    /// Handles the completion of the SDK initialization process.
    ///
    /// This method is called when the SDK initialization completes. It processes the initialization status,
    /// checks adapter readiness, and notifies the result.
    ///
    /// - Parameter status: The initialization status containing information about adapter states.
    private func onInitialized(status: InitializationStatus) {
        isInitInProgress = false
        
        if status.adapterStatuses.isEmpty {
            sdkInitCompletionHandler?(false, NSError(domain: "BSUInitializer",
                                                     code: 1001,
                                                     userInfo: [NSLocalizedDescriptionKey : "No Adapters found"]))
            return
        }
        
        var isAnyAdapterReady = false
        var errorMessage = "Adapters are not initialized"
        
        let adapterStatusMap = status.adapterStatuses.mapValues { adapterStatus in
            if (adapterStatus.state == .ready) {
                isAnyAdapterReady = true
            } else if (adapterStatus.name == "mngPerf") {
                errorMessage = adapterStatus.statusDescription ?? errorMessage
            }
            
            return [
                "name": adapterStatus.name,
                "state": adapterStatus.state.rawValue,
                "description": adapterStatus.statusDescription ?? ""
            ]
        }
        
        logAdaptersStatus(adapterStatuses: status.adapterStatuses)
        
        if isAnyAdapterReady {
            sdkInitCompletionHandler?(true, nil)
        } else {
            sdkInitCompletionHandler?(false, NSError(domain: "BSUInitializer",
                                                     code: 1001,
                                                     userInfo: [NSLocalizedDescriptionKey : errorMessage]))
        }
        
      adaptersInitCompletionHandler?(status)
    }
    
    /// Logs the status of all adapters to the console for debugging purposes.
    ///
    /// - Parameter adapterStatuses: A dictionary mapping adapter names to their status information.
    private func logAdaptersStatus(adapterStatuses: [String: AdapterStatus]) {
        print("BlueStack Adapters Initialization Status: \n")
        adapterStatuses.forEach { (adNetworkName, adapterStatus) in
            print(" Provider: \(adapterStatus.name), Description: \(adapterStatus.statusDescription ?? ""), State: \(adapterStatus.state)")
        }
    }
    
}
