//
//  AnagogStateManager.swift
//
//  Copyright © 2022 Anagog Ltd. All rights reserved.
//

import Foundation
import JedAIAppKit
import JedAIKit

class AnagogStateManager {
    private let persistantStorage: PersistentStorageProtocol
    private let eventEmitterManager: AnagogEventEmitterManager
    private var jedaiStateListener = JedAIStateEvent.Listener()
    
    private(set) var isStartupAllowed: Bool {
        get {
            self.persistantStorage.object(forKey: .isStartupAllowedKey) as? Bool ?? self.jedaiAutoEnabled
        }
        set {
            self.persistantStorage.set(newValue, forKey: .isStartupAllowedKey)
        }
    }
    
    var jedaiAutoEnabled: Bool = true
    
    internal var sdkIsInitialized: Bool = false
    
    private var startupCallback: (() -> ())? = nil
    private var shutdownCallback: (() -> ())? = nil
    
    init(persistantStorage: PersistentStorageProtocol, eventEmitterManager: AnagogEventEmitterManager) {
        self.persistantStorage = persistantStorage
        self.eventEmitterManager = eventEmitterManager
        
        jedaiStateListener.listen { [weak self] event in
            guard let self else {
                return
            }
            if event.state == JedAIState.active {
                self.eventEmitterManager.sendEvent(.onJedAIStatusChange, payload: ["status": true])
                self.startupCallback?()
                self.startupCallback = nil
                os_log_file("[package] SDK started", type: .info)
            }
            else if event.state == JedAIState.passive {
                self.eventEmitterManager.sendEvent(.onJedAIStatusChange, payload: ["status": false])
                self.shutdownCallback?()
                self.shutdownCallback = nil
                os_log_file("[package] SDK stopped", type: .info)
            }
        }
    }
    
    func enableJedAI(launchOptions: [UIApplication.LaunchOptionsKey: Any]?, callback: @escaping () -> ()) {
        os_log_file("[package] Enable JedAI", type: .info)
        self.isStartupAllowed = true
        guard JedAI.shared.state == JedAIState.passive else {
            callback()
            return
        }
        startupCallback = callback
        startup(withOptions: launchOptions)
    }
    
    func disableJedAI(cleanup: Bool, callback: @escaping () -> ()) {
        os_log_file("[package] Disable JedAI", type: .info)
        self.isStartupAllowed = false
        guard JedAI.shared.state == JedAIState.active else {
            callback()
            return
        }
        shutdownCallback = callback
        shutdown(fullstop: true, cleanup: cleanup)
    }
    
    func startup(withOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
        print("[package] Startup")
        self.sdkIsInitialized = true
        guard self.isStartupAllowed else {
            debugPrint("[package] JedAI startup aborted by configurations")
            return
        }
        guard self.sdkIsInitialized else {
            assertionFailure("AnagogSDK is not initialized yet")
            return
        }
        
        JedAIApp.shared.startup(launchOptions: launchOptions)
    }
    
    func shutdown(fullstop: Bool, cleanup: Bool) {
        os_log_file("[package] Shutdown with fullstop: %@ and cleanup: %@", type: .info, fullstop ? "true" : "false", cleanup ? "true" : "false")
        guard self.sdkIsInitialized else {
            assertionFailure("AnagogSDK is not initialized yet")
            return
        }
        
        JedAIApp.shared.shutdown(fullstop: fullstop, cleanup: cleanup)
    }
    
}
