import Foundation
import UIKit
import WortiseSDK

@objc
public class WortiseInterstitial: NSObject {

    @objc
    public static let shared = WortiseInterstitial()


    fileprivate var instances = [Int: WAInterstitialAd]()


    @objc
    public func create(_ id: Int, adUnitId: String) {
        if instances.keys.contains(id) {
            return
        }

        let ad = WAInterstitialAd(adUnitId: adUnitId)

        ad.delegate = WortiseInterstitialDelegate(id)

        instances[id] = ad
    }

    @objc
    public func destroy(_ id: Int) {
        guard let instance = instances.removeValue(forKey: id) else {
            return
        }

        DispatchQueue.main.async {
            instance.destroy()
        }
    }

    @objc
    public func isAvailable(_ id: Int) -> Bool {
        return instances[id]?.isAvailable ?? false
    }

    @objc
    public func isDestroyed(_ id: Int) -> Bool {
        return instances[id]?.isDestroyed ?? false
    }

    @objc
    public func isShowing(_ id: Int) -> Bool {
        return instances[id]?.isShowing ?? false
    }

    @objc
    public func loadAd(_ id: Int) {
        DispatchQueue.main.async {
            self.instances[id]?.loadAd()
        }
    }

    @objc
    public func showAd(_ id: Int) {
        guard let controller = WortiseUtils.rootViewController else {
            return
        }

        DispatchQueue.main.async {
            self.instances[id]?.showAd(from: controller)
        }
    }
}

class WortiseInterstitialDelegate: WAInterstitialDelegate {

    fileprivate let id: Int


    init(_ id: Int) {
        self.id = id
    }

    func didClick(interstitialAd: WAInterstitialAd) {
        WortiseUtils.send(event: "OnInterstitialClicked", message: String(id))
    }
    
    func didDismiss(interstitialAd: WAInterstitialAd) {
        WortiseUtils.send(event: "OnInterstitialDismissed", message: String(id))
    }
    
    func didFailToLoad(interstitialAd: WAInterstitialAd, error: WAAdError) {
        WortiseUtils.send(event: "OnInterstitialFailedToLoad", message: String(id))
    }
    
    func didFailToShow(interstitialAd: WAInterstitialAd, error: WAAdError) {
        WortiseUtils.send(event: "OnInterstitialFailedToShow", message: String(id))
    }

    func didImpress(interstitialAd: WAInterstitialAd) {
        WortiseUtils.send(event: "OnInterstitialImpression", message: String(id))
    }

    func didLoad(interstitialAd: WAInterstitialAd) {
        WortiseUtils.send(event: "OnInterstitialLoaded", message: String(id))
    }

    func didPayRevenue(interstitialAd: WAInterstitialAd, data: WARevenueData) {
        var dictionary = data.toDictionary()

        dictionary["id"] = id

        WortiseUtils.send(event: "OnInterstitialRevenuePaid", data: dictionary)
    }
    
    func didShow(interstitialAd: WAInterstitialAd) {
        WortiseUtils.send(event: "OnInterstitialShown", message: String(id))
    }
}
