import Foundation
import UIKit
import AsyncDisplayKit

private final class ViewControllerTracingNodeView: UITracingLayerView {
    private var inHitTest = false
    var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)?
    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if self.inHitTest {
            return super.hitTest(point, with: event)
        } else {
            self.inHitTest = true
            let result = self.hitTestImpl?(point, event)
            self.inHitTest = false
            return result
        }
    }
}

open class ViewControllerTracingNode: ASDisplayNode {
    override public init() {
        super.init()
        
        self.setViewBlock({
            return ViewControllerTracingNodeView()
        })
    }
    
    override open func didLoad() {
        super.didLoad()
        
        (self.view as! ViewControllerTracingNodeView).hitTestImpl = { [weak self] point, event in
            return self?.hitTest(point, with: event)
        }
    }
}