import SwiftUI

public extension View {
    func navigationSwipeDisabled(navigationBarHidden: Bool) -> some View {
        modifier(
            NavigationSwipeDisabled(
                navigationBarHidden: navigationBarHidden
            )
        )
    }
}

private struct NavigationSwipeDisabled: ViewModifier {
    let navigationBarHidden: Bool

    func body(content: Content) -> some View {
        content.background(
            NavigationControllerModifier(
                disableSwipe: true,
                hideNavigationBar: navigationBarHidden
            )
        )
    }
}

private struct NavigationControllerModifier: UIViewControllerRepresentable {
    let disableSwipe: Bool
    let hideNavigationBar: Bool

    class Coordinator {
        var originalSwipeEnabled: Bool?
        var originalFullWidthEnabled: Bool?
        var originalNavBarHidden: Bool?
        weak var navigationController: UINavigationController?
    }

    func makeCoordinator() -> Coordinator {
        Coordinator()
    }

    func makeUIViewController(context _: Context) -> UIViewController {
        UIViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        DispatchQueue.main.async {
            guard let nav = uiViewController.navigationController else { return }

            // Store previous states
            if context.coordinator.originalSwipeEnabled == nil {
                context.coordinator.originalSwipeEnabled = nav.interactivePopGestureRecognizer?.isEnabled
                context.coordinator.originalFullWidthEnabled = nav.fullWidthPopGesture?.isEnabled
                context.coordinator.originalNavBarHidden = nav.navigationBar.isHidden
                context.coordinator.navigationController = nav
            }

            nav.interactivePopGestureRecognizer?.isEnabled = !disableSwipe
            nav.fullWidthPopGesture?.isEnabled = !disableSwipe
            nav.navigationBar.isHidden = hideNavigationBar
        }
    }

    static func dismantleUIViewController(_: UIViewController, coordinator: Coordinator) {
        guard let nav = coordinator.navigationController else { return }

        // Restore previous states
        nav.interactivePopGestureRecognizer?.isEnabled = coordinator.originalSwipeEnabled ?? true

        nav.fullWidthPopGesture?.isEnabled = coordinator.originalFullWidthEnabled ?? true
        nav.navigationBar.isHidden = coordinator.originalNavBarHidden ?? false
    }
}
