
import WebKit

@objc
public protocol _ViewFinder {
    
    func findWKWebView(withTag reactTag: NSNumber,
                       in uiManager: _RCTUIManager,
                       onCompletion completion: @escaping (WKWebView?) -> Void)

    func findView(withTag reactTag: NSNumber,
                       in uiManager: _RCTUIManager,
                       onCompletion completion: @escaping (UIView?) -> Void)
}

public class ViewFinder: NSObject {}

extension ViewFinder: _ViewFinder {
    
    public func findWKWebView(withTag reactTag: NSNumber,
                              in uiManager: _RCTUIManager,
                              onCompletion completion: @escaping (WKWebView?) -> Void) {
        RCTExecuteOnMainQueue { [weak self] in
            guard let self = self else { return }
            if let view = uiManager.view(forReactTag: reactTag) {
                completion(self.findFirstWKWebView(in: view))
            }
        }
    }
    
    func findFirstWKWebView(in view: UIView) -> WKWebView? {
        if let webView = view as? WKWebView {
            return webView
        }
        
        for subview in view.subviews {
            if let webView = subview as? WKWebView {
                return webView
            } else if subview.subviews.count > 0,
                      let foundView = findFirstWKWebView(in: subview) {
                return foundView
            }
        }
        return nil
    }

    public func findView(withTag reactTag: NSNumber,
                              in uiManager: _RCTUIManager,
                              onCompletion completion: @escaping (UIView?) -> Void) {
        RCTExecuteOnMainQueue { [weak self] in
            guard let self = self else { return }
            completion(uiManager.view(forReactTag: reactTag))
        }
    }
}
