import ContentsquareModule
import Foundation
import UIKit
import WebKit

class ContentsquareCAPTagInjector {
    private var jsQueue = [JsTask]()
    private var isInjecting = false
    private let webView: WKWebView
    
    init(webView: WKWebView) {
        self.webView = webView
    }
     
    func addToJSQueue(tag: String, jsToInject: String, isTagInjected: Bool) {
        let jsTask = JsTask(jsToInject: jsToInject, tag: tag, isTagInjected: isTagInjected)
        jsQueue.append(jsTask)
        
        if !isInjecting {
            injectNextJSFromQueue()
        }
    }
    
    private func injectNextJSFromQueue() {
        if !jsQueue.isEmpty {
            isInjecting = true
            let nextJsTask = jsQueue.removeFirst()
            injectJS(jsTask: nextJsTask)
        } else {
            isInjecting = false
        }
    }

    private func injectJS(jsTask: JsTask) {
        DispatchQueue.main.async {
            guard jsTask.isTagInjected else {
                self.webView.evaluateJavaScript(jsTask.jsToInject) { [self] (result, error) in
                    if let error = error {
                        logger(.important, message: "Error evaluating JavaScript: \(error)");
                        self.injectNextJSFromQueue();
                        return
                    }
                    logger(.important, message: " Script injected: \(jsTask.tag)");
                    self.injectNextJSFromQueue()
                }
                return
            }
            
            self.webView.evaluateJavaScript("typeof window.trackingTagInjected !== 'undefined';") { [self] (result, error) in
                
                if let error = error {
                    logger(.important, message: "Error evaluating JavaScript: \(error)")
                    self.injectNextJSFromQueue()
                    return
                }
                
                if let isDefined = result as? Bool {
                    if isDefined {
                        logger(.important, message: "injectJS: window.trackingTagInjected already exists, skipping injection")
                        self.injectNextJSFromQueue()
                    } else {
                        let beforeContent = "window._uxa = window._uxa || [];\n" +
                        "window._uxa.push([\"setOption\", \"isWebView\", true]);\n"
                        
                        webView.evaluateJavaScript(beforeContent + jsTask.jsToInject) { (value, error) in
                            if let error = error {
                                logger(.important, message: "Error injecting JS: \(error.localizedDescription)")
                                self.injectNextJSFromQueue()
                            } else {
                                logger(.important, message: "TT injectJS: \(jsTask.tag)")
                                self.injectNextJSFromQueue()
                            }
                        }
                    }
                } else {
                    logger(.important, message: "JavaScript result is not a Bool")
                    self.injectNextJSFromQueue()
                }
            }
        }
    }
    
}

struct JsTask {
    let jsToInject: String
    let tag: String
    let isTagInjected: Bool
}
