import UIKit

private var FullWidthPopGestureKey: UInt8 = 0

extension UINavigationController: @retroactive UIGestureRecognizerDelegate {
    var fullWidthPopGesture: UIPanGestureRecognizer? {
        get { objc_getAssociatedObject(self, &FullWidthPopGestureKey) as? UIPanGestureRecognizer }
        set { objc_setAssociatedObject(self, &FullWidthPopGestureKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
    }

    open override func viewDidLoad() {
        super.viewDidLoad()

        interactivePopGestureRecognizer?.delegate = self
        interactivePopGestureRecognizer?.isEnabled = false

        let gesture = UIPanGestureRecognizer()
        if let targets = interactivePopGestureRecognizer?.value(forKey: "targets") as? [NSObject],
           let targetObject = targets.first {
            let internalTarget = targetObject.value(forKey: "target")
            let internalAction = Selector(("handleNavigationTransition:"))
            gesture.addTarget(internalTarget as Any, action: internalAction)
            gesture.delegate = self
            view.addGestureRecognizer(gesture)
            fullWidthPopGesture = gesture
        }
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard viewControllers.count > 1 else { return false }

        if let panGesture = gestureRecognizer as? UIPanGestureRecognizer {
            let translation = panGesture.translation(in: view)
            return translation.x > 0
        }

        return true
    }
}
