import SwiftUI
import SwiftUIIntrospect
import UIKit

public final class NoAnimationTabBarController: UITabBarController {
    public override func viewDidLoad() {
        super.viewDidLoad()

        // No need to override delegate for iOS versions below 18 as they do not have default tab transition animations.
        if #available(iOS 18.0, *) {
            delegate = self
        }
    }
}

extension NoAnimationTabBarController: UITabBarControllerDelegate {
    public func tabBarController(
        _ tabBarController: UITabBarController,
        animationControllerForTransitionFrom fromVC: UIViewController,
        to toVC: UIViewController
    ) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
}

extension NoAnimationTabBarController: UIViewControllerAnimatedTransitioning {
    public func transitionDuration(using transitionContext: (any UIViewControllerContextTransitioning)?) -> TimeInterval {
        return .zero
    }

    public func animateTransition(using transitionContext: any UIViewControllerContextTransitioning) {
        guard let view = transitionContext.view(forKey: .to)
            else {
                return
        }

        let container = transitionContext.containerView
        container.addSubview(view)

        transitionContext.completeTransition(true)
    }
}

private struct RemoveTransitionsModifier: ViewModifier {
    static let delegate = NoAnimationTabBarController()

    func body(content: Content) -> some View {
        content
            .introspect(.tabView, on: .iOS(.v18, .v26)) { tabView in
                tabView.delegate = Self.delegate
            }
    }
}

public extension TabView {
    /// Removes the default transition animations when switching between tabs.
    func removeTransitions() -> some View {
        modifier(RemoveTransitionsModifier())
    }
}
