import SwiftUI

public struct StretchingHeaderContent<Header: View, Content: View>: View {
    @State private var scrollOffset: CGFloat = 0
    private let header: (CGFloat) -> Header
    private let content: () -> Content
    private let headerHeight: CGFloat

    public init(
        headerHeight: CGFloat = 400,
        @ViewBuilder header: @escaping (CGFloat) -> Header,
        @ViewBuilder content: @escaping () -> Content
    ) {
        self.headerHeight = headerHeight
        self.header = header
        self.content = content
    }

    public var body: some View {
        List {
            Color.clear
                .overlay {
                    header(scrollOffset)
                        .padding(.top, min(0, scrollOffset))
                }
                .frame(height: headerHeight)
                .trackScrollOffset(coordinateSpace: "scroll", isHorizontal: false) { offset in
                    scrollOffset = offset
                }
                .listRowInsets(.init())
                .listRowSeparator(.hidden)
                .listRowBackground(Color.clear)

            content()
                .listRowInsets(.init())
                .listRowSeparator(.hidden)
                .listRowBackground(Color.clear)
        }
        .scrollEdgeEffect(hidden: scrollOffset < headerHeight / 2.0, for: .top)
        .listStyle(.plain)
        .scrollContentBackground(.hidden)
        .ignoresSafeArea()
        .coordinateSpace(name: "scroll")
        .background(Color.clear)
    }
}
