import GravitySDK
import SwiftUI
import UIKit

@main
struct GravityDemoApp: App {
    init() {
        GravitySDK.initialize(
            apiKey: "YOUR_API_KEY",
            section: "YOUR_SECTION_ID",
            gravityEventCallback: { event in
                if let event = event as? FollowUrlEvent,
                   let url = URL(string: event.url) {
                    UIApplication.shared.open(url)
                } else if let event = event as? FollowDeeplinkEvent {
                    // Передайте event.deeplink в роутер приложения.
                    print("Deeplink: \(event.deeplink)")
                }
            },
            productViewBuilder: DemoProductBuilder(),
            logLevel: .error
        )
    }

    var body: some Scene {
        WindowGroup {
            DemoScreen()
        }
    }
}

private struct DemoScreen: View {
    private let pageContext = PageContext(
        type: .product,
        data: ["sku-123"],
        location: "app://product/sku-123"
    )

    var body: some View {
        ScrollView {
            VStack(spacing: 16) {
                Text("Товар sku-123")
                Button("Добавить в корзину") {
                    // В приложении отправляйте событие после изменения корзины.
                    GravitySDK.instance.triggerEvent(
                        events: [AddToCartEvent(
                            value: 1990,
                            productId: "sku-123",
                            quantity: 1,
                            currency: "RUB"
                        )],
                        pageContext: pageContext
                    )
                }
                GravityInlineSwiftUIView(
                    selector: "product_recommendations",
                    pageContext: pageContext,
                    loader: { ProgressView() }
                )
                .frame(height: 250)
            }
            .padding()
        }
        .onAppear {
            GravitySDK.instance.trackView(pageContext: pageContext)
        }
    }
}

private struct DemoProductBuilder: ProductViewBuilder {
    func build(slot: Slot, content: CampaignContent, campaign: Campaign) -> AnyView {
        AnyView(
            Button {
                GravitySDK.instance.sendProductEngagement(
                    engagement: ProductClickEngagement(
                        slot: slot,
                        content: content,
                        campaign: campaign
                    )
                )
                // Откройте товар через роутер приложения.
                print("Product: \(slot.item["sku"] ?? nil)")
            } label: {
                Text((slot.item["name"] ?? nil) as? String ?? "Товар")
                    .frame(width: 164, height: 160)
            }
        )
    }
}
