import SwiftUI

public struct PagingView<Content: View>: View {
    private var config: _PagingViewConfig
    private var page: Binding<Int>?
    private var content: Content

    public init(
        direction: _PagingViewConfig.Direction = .horizontal,
        size: CGFloat? = nil,
        margin: CGFloat = 0,
        spacing: CGFloat = 0,
        constrainedDeceleration: Bool = true,
        page: Binding<Int>? = nil,
        @ViewBuilder content: () -> Content
    ) {
        self.config = .init(
            direction: direction,
            size: size,
            margin: margin,
            spacing: spacing,
            constrainedDeceleration: constrainedDeceleration
        )
        self.page = page
        self.content = content()
    }

    private struct Layout: _VariadicView.UnaryViewRoot {
        var config: _PagingViewConfig
        var page: Binding<Int>?

        func body(children: _VariadicView.Children) -> some View {
            _PagingView(
                config: config,
                page: page,
                views: children
            )
        }
    }

    public var body: some View {
        _VariadicView.Tree(Layout(config: config, page: page)) {
            content
        }
    }
}
