import WebKit;
import ContentsquareSDK;

class WebViewHandler {
    
    let viewFinder: _ViewFinder
    private var observationToken: NSKeyValueObservation?
    
    @objc
    public init(viewFinder: _ViewFinder = ViewFinder()) {
        self.viewFinder = viewFinder
    }
}

extension WebViewHandler: _WebViewHandler {
    
    @objc
    func registerWebview(withTag webViewTag:NSNumber,
                       in uiManager:_RCTUIManager) {
        viewFinder.findWKWebView(withTag: webViewTag, in: uiManager) { [weak self] webView in
            if let webView = webView, let self = self {
                log(.info, message: "WebView found in native bridge. Ready to be injected")
                // For new CSQWebView implementation, we need to wait for the page to be fully loaded before injecting the SDK
                if webView.estimatedProgress == 1.0 {
                    log(.info, message: "Registering webview from native bridge")
                    CSQ.registerWebView(webView)
                } else {
                    log(.info, message: "Adding observer for webview loading completion")
                    self.observationToken = webView.observe(\.isLoading, options: .new, changeHandler: self.observeWebViewLoadingCompletion)
                }
            }
        }
    }
    
    private func observeWebViewLoadingCompletion(webView: WKWebView, change: NSKeyValueObservedChange<Bool>) {
        // This block is only called when `isLoading` changes.
        if !webView.isLoading {
            log(.info, message: "Registering webview from native bridge")
            CSQ.registerWebView(webView)
            
            // Invalidate the token to stop observing.
            observationToken?.invalidate()
            observationToken = nil
        }
    }
    
    @objc
    func unregisterWebview(withTag webViewTag:NSNumber,
                                  from uiManager:_RCTUIManager) {
        viewFinder.findWKWebView(withTag: webViewTag,
                               in: uiManager) { webView in
            if let webView = webView {
                log(.info, message: "WebView found in native bridge. Ready to remove injection")
                CSQ.unregisterWebView(webView)
            }
        }
    }
}
