//
//  BSUInterstitialAd.swift
//  UnityFramework
//
//  Created by Moin Hasan on 5/21/25.
//

import Foundation
import BlueStackSDK
import UIKit

@objc(BSUInterstitialAd)
public class BSUInterstitialAd: NSObject {
    @objc public var interstitialClient: BSUTypeInterstitialClientRefPointer?
    @objc public var onDidLoadedCallback: BSUOnInterstitialDidLoadedCallback?
    @objc public var onDidFailCallback: BSUOnInterstitialDidFailCallback?
    @objc public var onClickedCallback: BSUOnInterstitialClickedCallback?
    @objc public var onDisappearCallback: BSUOnInterstitialDisappearCallback?
    @objc public var onDidShownCallback: BSUOnInterstitialDidShownCallback?

    private var interstitialAdsFactory: InterstitialAd?
    private var showWhenLoaded = false
        
    @objc public init(interstitialClientReference: BSUTypeInterstitialClientRefPointer?, placementId: String?) {
        self.interstitialClient = interstitialClientReference
        super.init()
        self.interstitialAdsFactory = InterstitialAd(placementID: placementId!)
        self.interstitialAdsFactory?.delegate = self
        self.interstitialAdsFactory?.fullScreenDelegate = self
        self.interstitialAdsFactory?.viewController = BSUPluginUtil.unityGLViewController()
    }

    @objc public func loadAd() {
        DispatchQueue.main.async {
            self.interstitialAdsFactory?.load()
        }
    }

    @objc public func loadAd(withRequestOptions requestOptionsRef: BSUTypeRequestOptionsRef) {
        let bsuOptions = Unmanaged<BSURequestOptions>.fromOpaque(requestOptionsRef).takeUnretainedValue()
        let sdkOptions = bsuOptions.toSDKRequestOptions()
        DispatchQueue.main.async {
            self.interstitialAdsFactory?.load(requestOptions: sdkOptions)
        }
    }

    @objc public func show() {
        if let interstitialAd = self.interstitialAdsFactory {
            if interstitialAd.isReady {
                DispatchQueue.main.async {
                    interstitialAd.show(fromRootViewController: self.interstitialAdsFactory?.viewController)
                }
            }
        }
    }

    @objc public func destroy() {
        interstitialAdsFactory = nil
    }
}

extension BSUInterstitialAd: InterstitialAdDelegate {
    public func onAdLoaded(_ ad: BlueStackSDK.InterstitialAd) {
        onDidLoadedCallback?(interstitialClient)
    }
    
    public func onAdFailedToLoad(_ ad: BlueStackSDK.InterstitialAd, _ error: any Error) {
        if let nsError = error as NSError? {
            let errorPointer = Unmanaged.passUnretained(nsError).toOpaque()
            onDidFailCallback?(interstitialClient, errorPointer)
        } else {
            onDidFailCallback?(interstitialClient, nil)
        }
    }
}

extension BSUInterstitialAd: FullScreenDelegate {
    public func onAdDisplayed(_ ad: any FullScreenDisplayableAd) {
        onDidShownCallback?(interstitialClient)
    }
    
    public func onAdFailedToDisplay(_ ad: any FullScreenDisplayableAd, _ error: any Error) {
        if let nsError = error as NSError? {
            let errorPointer = Unmanaged.passUnretained(nsError).toOpaque()
            onDidFailCallback?(interstitialClient, errorPointer)
        } else {
            onDidFailCallback?(interstitialClient, nil)
        }
    }
    
    public func onAdClicked(_ ad: any FullScreenDisplayableAd) {
        onClickedCallback?(interstitialClient)
    }
    
    public func onAdDismissed(_ ad: any FullScreenDisplayableAd) {
        onDisappearCallback?(interstitialClient)
    }
}


