import GravitySDK
import SwiftUI

struct CheckoutExperimentView: View {
    let pageContext: PageContext
    let onCheckout: () -> Void

    @State private var selected: SelectedGravityContent?
    @State private var config: CheckoutExperimentConfig?
    @State private var isLoading = true
    @State private var hasStartedLoading = false
    @State private var shownContentId: String?

    var body: some View {
        Group {
            if isLoading {
                ProgressView()
            } else {
                Button(config?.label ?? "Перейти к оплате") {
                    // Бизнес-действие отправляется отдельно от content engagement.
                    GravitySDK.instance.triggerEvent(
                        events: [CustomEvent(
                            type: "checkout-started-v1",
                            name: "Checkout Started"
                        )],
                        pageContext: pageContext
                    )
                    onCheckout()
                }
                .padding(config?.variant == .compact ? 8 : 16)
                .onAppear {
                    guard let selected, config != nil,
                          shownContentId != selected.content.contentId
                    else { return }
                    shownContentId = selected.content.contentId
                    GravitySDK.instance.sendContentEngagement(
                        engagement: ContentImpressionEngagement(
                            content: selected.content,
                            campaign: selected.campaign
                        )
                    )
                }
            }
        }
        // При смене контекста меняйте Hashable placementKey в .id(placementKey).
        .onAppear {
            guard !hasStartedLoading else { return }
            hasStartedLoading = true
            Task {
                let result = await loadRootGravityContent(
                    selector: "checkout_button",
                    pageContext: pageContext
                )
                let decoded = result.flatMap(decodeCheckoutExperiment)
                await MainActor.run {
                    selected = decoded == nil ? nil : result
                    config = decoded
                    isLoading = false
                }
            }
        }
    }
}
