import Foundation
import UIKit
import WortiseSDK

class BannerInstance {

    let ad: WABannerAd

    var sizeConstraints: [NSLayoutConstraint]?

    init(ad: WABannerAd) {
        self.ad = ad
    }
}

@objc
public class WortiseBanner: NSObject {

    @objc
    public static let shared = WortiseBanner()


    fileprivate var instances = [Int: BannerInstance]()


    @objc
    public func create(_ id:       Int,
                       adUnitId:   String,
                       adWidth:    Int,
                       adHeight:   Int,
                       adType:     String,
                       adPosition: Int) {

        if instances.keys.contains(id) {
            return
        }

        let size: WAAdSize

        switch adType {
        case "Anchored":
            size = WAAdSize.getAnchoredAdaptiveBannerAdSize(width: CGFloat(adWidth))

        case "Inline":
            size = WAAdSize.getInlineAdaptiveBannerAdSize(width: CGFloat(adWidth), maxHeight: CGFloat(adHeight))

        default:
            size = WAAdSize(width: CGFloat(adWidth), height: CGFloat(adHeight))
        }

        let ad = WABannerAd()

        ad.adSize             = size
        ad.adUnitId           = adUnitId
        ad.delegate           = WortiseBannerDelegate(id)
        ad.rootViewController = WortiseUtils.rootViewController

        addContainer(ad, position: adPosition)

        instances[id] = BannerInstance(ad: ad)
    }

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

        DispatchQueue.main.async {

            instance.ad.destroy()

            self.removeContainer(instance.ad)
        }
    }

    @objc
    public func getAdHeight(_ id: Int, inPixels: Bool) -> Int {
        guard var value = instances[id]?.ad.adHeight else {
            return -1
        }
        
        if inPixels {
            value *= UIScreen.main.scale
        }

        return Int(value)
    }

    @objc
    public func getAdWidth(_ id: Int, inPixels: Bool) -> Int {
        guard var value = instances[id]?.ad.adWidth else {
            return -1
        }
        
        if inPixels {
            value *= UIScreen.main.scale
        }

        return Int(value)
    }

    @objc
    public func getAutoRefreshTime(_ id: Int) -> Int64 {
        guard let time = instances[id]?.ad.autoRefreshTime, time >= 0 else {
            return -1
        }

        return Int64(time * 1000)
    }

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

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

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

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

    @objc
    public func setAutoRefreshTime(_ id: Int, value: Int64) {
        instances[id]?.ad.autoRefreshTime = Double(value) / 1000
    }


    fileprivate func addContainer(_ ad: WABannerAd, position: Int) {
        guard let controller = WortiseUtils.rootViewController, ad.superview == nil else {
            return
        }

        ad.translatesAutoresizingMaskIntoConstraints = false

        controller.view.addSubview(ad)
        
        let constraints = WortiseAdPosition.getLayoutConstraints(for:       ad,
                                                                 superview: controller.view,
                                                                 position:  position)
        
        NSLayoutConstraint.activate(constraints)
    }

    fileprivate func removeContainer(_ ad: WABannerAd) {
        ad.removeFromSuperview()
    }
}

class WortiseBannerDelegate: WABannerDelegate {

    fileprivate let id: Int


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

    func didClick(bannerAd: WABannerAd) {
        WortiseUtils.send(event: "OnBannerClicked", message: String(id))
    }

    func didFailToLoad(bannerAd: WABannerAd, error: WAAdError) {
        WortiseUtils.send(event: "OnBannerFailedToLoad", message: String(id))
    }

    func didImpress(bannerAd: WABannerAd) {
        WortiseUtils.send(event: "OnBannerImpression", message: String(id))
    }

    func didLoad(bannerAd: WABannerAd) {
        if let instance = WortiseBanner.shared.instances[id] {

            if let oldConstraints = instance.sizeConstraints {
                NSLayoutConstraint.deactivate(oldConstraints)
            }

            let constraints = [
                bannerAd.widthAnchor .constraint(equalToConstant: bannerAd.adWidth),
                bannerAd.heightAnchor.constraint(equalToConstant: bannerAd.adHeight)
            ]

            NSLayoutConstraint.activate(constraints)

            instance.sizeConstraints = constraints

            bannerAd.superview?.layoutIfNeeded()
        }

        WortiseUtils.send(event: "OnBannerLoaded", message: String(id))
    }

    func didPayRevenue(bannerAd: WABannerAd, data: WARevenueData) {
        var dictionary = data.toDictionary()

        dictionary["id"] = id

        WortiseUtils.send(event: "OnBannerRevenuePaid", data: dictionary)
    }
}
