import Foundation
import GravitySDK

struct SelectedGravityContent {
    let campaign: Campaign
    let content: CampaignContent
}

// Для Custom JSON-примера кампания содержит корневой content с step == nil.
func loadRootGravityContent(
    selector: String,
    pageContext: PageContext
) async -> SelectedGravityContent? {
    guard let response = await GravitySDK.instance.getContentBySelector(
        selector: selector,
        pageContext: pageContext
    ) else { return nil }

    for campaign in response.data {
        for variation in campaign.payload {
            if let content = variation.contents.first(where: { $0.step == nil }) {
                return SelectedGravityContent(campaign: campaign, content: content)
            }
        }
    }
    return nil
}

struct CheckoutExperimentConfig: Decodable {
    enum Variant: String, Decodable {
        case control
        case compact
    }
    let variant: Variant
    let label: String
}

func decodeCheckoutExperiment(_ selected: SelectedGravityContent) -> CheckoutExperimentConfig? {
    guard let json = selected.content.custom?.json,
          let data = json.data(using: .utf8),
          let config = try? JSONDecoder().decode(CheckoutExperimentConfig.self, from: data),
          !config.label.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
    else { return nil }
    return config
}
