import ComposableArchitecture
import SwiftUI

/// A view modifier that adds safe area insets to account for the tab bar and omniplayer
private struct OmniPlayerSafeAreaModifier: ViewModifier {
    @Shared(.inMemory(.isCompactPlayerVisible)) private var isCompactPlayerVisible = false
    private let additionalBottomPadding: CGFloat
    private let includeTabBar: Bool

    init(additionalBottomPadding: CGFloat = 0, includeTabBar: Bool = true) {
        self.additionalBottomPadding = additionalBottomPadding
        self.includeTabBar = includeTabBar
    }

    public func body(content: Content) -> some View {
        content
            .safeAreaInset(edge: .bottom, spacing: 0) {
                Color.clear
                    .frame(height: bottomInset)
            }
    }

    private var bottomInset: CGFloat {
        let tabBarHeight: CGFloat = includeTabBar ? CustomBottomBarConstants.tabBarHeight : 0
        let compactPlayerHeight: CGFloat = isCompactPlayerVisible ? OmniPlayerConstants.compactPlayerHeight : 0
        return tabBarHeight + compactPlayerHeight + additionalBottomPadding
    }
}

public extension View {
    /// Adds safe area insets to account for the tab bar and omniplayer when visible
    ///
    /// This modifier uses `safeAreaInset` for better integration with ScrollView and native scrolling behavior.
    /// It adds a clear spacer at the bottom with height equal to tab bar + omniplayer + any additional padding.
    ///
    /// Usage:
    /// ```swift
    /// ScrollView {
    ///     content
    /// }
    /// .omniPlayerSafeArea() // Standard behavior (tab bar + omniplayer)
    /// .omniPlayerSafeArea(additionalBottomPadding: 8) // With 8pt extra bottom spacing
    /// .omniPlayerSafeArea(includeTabBar: false) // Only omniplayer, no tab bar
    /// ```
    ///
    /// - Parameters:
    ///   - additionalBottomPadding: Extra bottom spacing to add beyond the tab bar and omniplayer heights (default: 0)
    ///   - includeTabBar: Whether to include tab bar height in calculation (default: true)
    /// - Returns: A view with appropriate bottom safe area insets for omniplayer and tab bar
    func omniPlayerSafeArea(
        additionalBottomPadding: CGFloat = 0,
        includeTabBar: Bool = true
    ) -> some View {
        modifier(OmniPlayerSafeAreaModifier(
            additionalBottomPadding: additionalBottomPadding,
            includeTabBar: includeTabBar
        ))
    }
}
