import Foundation
import UIKit
import WortiseSDK

@objc
public class WortiseRewarded: NSObject {

    @objc
    public static let shared = WortiseRewarded()


    fileprivate var instances = [Int: WARewardedAd]()


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

        let ad = WARewardedAd(adUnitId: adUnitId)

        ad.delegate = WortiseRewardedDelegate(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 WortiseRewardedDelegate: WARewardedDelegate {

    fileprivate let id: Int


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

    func didClick(rewardedAd: WARewardedAd) {
        WortiseUtils.send(event: "OnRewardedClicked", message: String(id))
    }

    func didComplete(rewardedAd: WARewardedAd, reward: WAReward) {
        var dictionary = reward.toDictionary()

        dictionary["id"] = id

        WortiseUtils.send(event: "OnRewardedCompleted", data: dictionary)
    }
    
    func didDismiss(rewardedAd: WARewardedAd) {
        WortiseUtils.send(event: "OnRewardedDismissed", message: String(id))
    }
    
    func didFailToLoad(rewardedAd: WARewardedAd, error: WAAdError) {
        WortiseUtils.send(event: "OnRewardedFailedToLoad", message: String(id))
    }
    
    func didFailToShow(rewardedAd: WARewardedAd, error: WAAdError) {
        WortiseUtils.send(event: "OnRewardedFailedToShow", message: String(id))
    }

    func didImpress(rewardedAd: WARewardedAd) {
        WortiseUtils.send(event: "OnRewardedImpression", message: String(id))
    }

    func didLoad(rewardedAd: WARewardedAd) {
        WortiseUtils.send(event: "OnRewardedLoaded", message: String(id))
    }

    func didPayRevenue(rewardedAd: WARewardedAd, data: WARevenueData) {
        var dictionary = data.toDictionary()

        dictionary["id"] = id

        WortiseUtils.send(event: "OnRewardedRevenuePaid", data: dictionary)
    }
    
    func didShow(rewardedAd: WARewardedAd) {
        WortiseUtils.send(event: "OnRewardedShown", message: String(id))
    }
}
