import SwiftUI
import GravitySDK

struct MyProductBuilder: ProductViewBuilder {
    func build(
        slot: Slot,
        content: CampaignContent,
        campaign: Campaign
    ) -> AnyView {
        let product = slot.recommendedProduct

        return AnyView(
            VStack(alignment: .leading, spacing: 8) {
                if #available(iOS 15.0, *),
                   let imageUrl = product.imageUrl,
                   let url = URL(string: imageUrl) {
                    SwiftUI.AsyncImage(url: url) { phase in
                        switch phase {
                        case .success(let image):
                            image
                                .resizable()
                                .scaledToFit()
                        default:
                            Color.gray.opacity(0.1)
                        }
                    }
                    .frame(height: 140)
                }

                Text(product.name)
                    .font(.headline)
                    .lineLimit(2)

                if let oldPrice = product.oldPrice {
                    Text(oldPrice)
                        .font(.caption)
                        .foregroundColor(.secondary)
                        .strikethrough()
                }

                if let price = product.price {
                    Text(price)
                        .font(.subheadline)
                        .fontWeight(.semibold)
                }
            }
            .frame(width: 164, alignment: .leading)
            .padding(8)
            .onTapGesture {
                GravitySDK.instance.sendProductEngagement(
                    engagement: ProductClickEngagement(
                        slot: slot,
                        content: content,
                        campaign: campaign
                    )
                )
                openProduct(url: product.url, sku: product.sku)
            }
        )
    }

    private func openProduct(url: String?, sku: String) {
        // Откройте экран товара в приложении или deeplink по url/sku.
    }
}

private struct RecommendedProduct {
    let sku: String
    let name: String
    let price: String?
    let oldPrice: String?
    let imageUrl: String?
    let url: String?
}

private extension Slot {
    var recommendedProduct: RecommendedProduct {
        RecommendedProduct(
            sku: stringValue("sku", "id") ?? slotId ?? String(strId),
            name: stringValue("name") ?? "Товар",
            price: stringValue("price"),
            oldPrice: stringValue("old_price", "oldPrice"),
            imageUrl: stringValue("image_url", "imageUrl"),
            url: stringValue("url")
        )
    }

    func stringValue(_ keys: String...) -> String? {
        for key in keys {
            guard let value = item[key] ?? nil else {
                continue
            }

            if let value = value as? String, !value.isEmpty {
                return value
            }

            return String(describing: value)
        }

        return nil
    }
}
