import Foundation
import StoreKit

final class CreditPurchaseService {
    static let shared = CreditPurchaseService()

    let productIDs = [
        "snaptrans.credits.50000",
        "snaptrans.credits.150000",
        "snaptrans.credits.300000",
        "snaptrans.credits.500000"
    ]

    func loadProducts() async throws -> [Product] {
        try await Product.products(for: productIDs)
    }

    func purchase(_ product: Product) async throws {
        let result = try await product.purchase()
        switch result {
        case .success(let verification):
            let transaction = try checkVerified(verification)
            try await BackendIAPService.shared.verifyPurchase(transaction: transaction)
            await transaction.finish()
        case .userCancelled:
            print("User cancelled")
        case .pending:
            print("Purchase pending")
        @unknown default:
            break
        }
    }

    func checkVerified<T>(_ result: VerificationResult<T>) throws -> T {
        switch result {
        case .unverified:
            throw NSError(domain: "StoreKit", code: 1, userInfo: [NSLocalizedDescriptionKey: "Transaction unverified"])
        case .verified(let safe):
            return safe
        }
    }
}

final class BackendIAPService {
    static let shared = BackendIAPService()
    let verifyURL = URL(string: "https://yourdomain.com/verify_purchase.php")!
    let appSecret = "luckyluke123a@#!"

    func verifyPurchase(transaction: Transaction) async throws {
        let payload: [String: Any] = [
            "device_id": DeviceIDService.shared.getDeviceID(),
            "product_id": transaction.productID,
            "transaction_id": String(transaction.id),
            "original_transaction_id": String(transaction.originalID),
            "signed_transaction_info": transaction.jwsRepresentation
        ]
        var request = URLRequest(url: verifyURL)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue(appSecret, forHTTPHeaderField: "X-App-Secret")
        request.httpBody = try JSONSerialization.data(withJSONObject: payload)
        let (data, _) = try await URLSession.shared.data(for: request)
        print(String(data: data, encoding: .utf8) ?? "")
    }
}

final class DeviceIDService {
    static let shared = DeviceIDService()
    private let key = "snaptrans_device_id"
    func getDeviceID() -> String {
        if let existing = UserDefaults.standard.string(forKey: key), !existing.isEmpty { return existing }
        let id = UUID().uuidString
        UserDefaults.standard.set(id, forKey: key)
        return id
    }
}
