//
//  AnagogStartupConfigurator.swift
//
//  Created by Alexey Siginur on 10/06/2025.
//

import Foundation
import JedAIAppKit
import JedAIKit
import JedAIUIKit
import os

protocol AnagogStartupConfiguratorProtocol {
    func configure()
    func configureFromJSON(_ configs: [String: Any])
}

extension AnagogStartupConfiguratorProtocol {
    internal var url: URL? {
        get {
            JedAIApp.shared.startupOptionsURL ?? Bundle.main.url(forResource: "anagog_config", withExtension: "json")
        }
        set {
            JedAIApp.shared.startupOptionsURL = newValue
        }
    }
}

class AnagogStartupConfigurator: AnagogStartupConfiguratorProtocol {
    internal weak var sdkWrapper: AnagogSDK?
    
    func configure() {
        // Validate initialization
        if self.sdkWrapper == nil {
            assertionFailure("Wrong AnagogSDK integration: `sdkWrapper` is not set. Please contact support.")
        }
        
        // JSON URL
        guard let configs = self.loadFromFile() else {
            return
        }
        
        // Plugin Configurations
        self.configureFromJSON(configs)

        // Handlers
        JedAIApp.shared.delegate = self
    }
    
    func configureFromJSON(_ configs: [String: Any]) {
        // Validate initialization
        if self.sdkWrapper == nil {
            assertionFailure("Wrong AnagogSDK integration: `sdkWrapper` is not set. Please contact support.")
        }
        
        if let value = configs["callCompletionHandlerForRemoteNotifications"] as? Bool {
            self.sdkWrapper?.callCompletionHandlerForRemoteNotifications = value
        }
        if let value = configs["overwriteUNUserNotificationCenterDelegate"] as? Bool {
            self.sdkWrapper?.overwriteUNUserNotificationCenterDelegate = value
        }
        if let jedaiAutoEnabled = configs["jedaiAutoEnabled"] as? Bool {
            self.sdkWrapper?.stateManager.jedaiAutoEnabled = jedaiAutoEnabled
        }
    }
    
    private func loadFromFile() -> [String: Any]? {
        guard let url = url else {
            print("[package] Info: Configuration File URL is nil")
            return nil
        }
        guard FileManager.default.fileExists(atPath: url.path) else {
            print("[package] Info: Configuration File doesn't exist \(url.path)")
            return nil
        }

        guard
            let data = try? Data(contentsOf: url),
            let configs = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any]
        else {
            print("[package] Error: Configuration File is damaged \(url.path)")
            return nil
        }
        
        print("[package] Info: Configuration File successfully loaded \(url.path)")
        return configs
    }
}

extension AnagogStartupConfigurator: JedAIDelegate {
//    @objc func anagogIntegrationMessageLog(logType: OSLogType, message: String) {
//
//    }
//
//    @objc func anagogDidReceiveBestMomentNotification(userInfo: [AnyHashable : Any]) {
//
//    }

    @objc func anagogDidReceiveBestMomentEvent() {
        os_log_file("[package] bestMomentEventHandler executed")
        self.sdkWrapper?.eventEmitterManager.sendEvent(.onBestMomentEvent, payload: nil)
    }
}

extension AnagogStartupConfigurator: JedAICampaignsDelegate {
    @objc func anagogDidCampaignTrigger(action: String?, userInfo: [AnyHashable : Any]) -> Bool {
        os_log_file("[package] campaignTriggerActionHandler executed with action: %@, userInfo: %@", action ?? "", userInfo)
        var payload = userInfo
        payload["action"] = action
        if let notification = payload["notification"] as? [String: Any],
           let userObject = notification["user_object"] as? [String: Any],
           let customData = userObject["custom_data"] {
            payload["custom_data"] = customData
        }
        self.sdkWrapper?.eventEmitterManager.sendEvent(.onCampaignTriggered, payload: payload)
        self.sdkWrapper?.campaignHandlers.campaignTriggerActionHandler?(action, payload)
        
        if let handler = self.sdkWrapper?.campaignHandlers.campaignNotificationApprovementHandler {
            return handler(userInfo)
        }
        return true
    }

    @objc func anagogDidCampaignNotificationClick(action: String?, actionPerformed: Bool, userInfo: [AnyHashable : Any]) {
        os_log_file("[package] notificationActionExecutionHandler executed with action: %@, success: %@, userInfo: %@", action ?? "", actionPerformed ? "true" : "false", userInfo)
        var payload = userInfo
        payload["action"] = action
        payload["executed"] = actionPerformed
        self.sdkWrapper?.eventEmitterManager.sendEvent(.onNotificationClick, payload: payload)
        self.sdkWrapper?.campaignHandlers.campaignNotificationClickActionHandler?(action, actionPerformed, userInfo)
    }
}
