// RelayAdEngine.swift // Base class for all ad engines with state machine // Corresponds to RelayAdEngine.kt in Android implementation import Foundation import UIKit public struct EventParams { public let ad: FusionAd? public let reward: FusionReward? public let displayFailedInfo: FusionError? public let loadFailedInfo: LoadFailedInfo? public let id: Int public init( ad: FusionAd? = nil, reward: FusionReward? = nil, displayFailedInfo: FusionError? = nil, loadFailedInfo: LoadFailedInfo? = nil, id: Int = -1 ) { self.ad = ad self.reward = reward self.displayFailedInfo = displayFailedInfo self.loadFailedInfo = loadFailedInfo self.id = id } } protocol OrientationAware { func onOrientationUpdate(orientation: ScreenOrientation) } public class RelayAdEngine: StateMachine { public let id: Int public let adType: AdType public var listener: FusionAdListener? public var supportedAdPlatforms: Set { fatalError("Subclass must implement") } public init(viewController: UIViewController, id: Int, adType: AdType, strategyName: String) { self.id = id self.adType = adType super.init(name: "\(adType.name)-\(strategyName)-\(id)") } // MARK: - Logging Methods public func logDebug(_ message: String) { Logger.d(tag: name, message: message) } public func logInfo(_ message: String) { Logger.i(tag: name, message: message) } public func logWarn(_ message: String) { Logger.w(tag: name, message: message) } public func logError(_ message: String) { Logger.e(tag: name, message: message) } // MARK: - Listener Callback Methods public func adLoaded(ad: FusionAd) { listener?.onAdLoaded(ad: ad) } public func adDisplayed(ad: FusionAd) { listener?.onAdDisplayed(ad: ad) } public func adHidden(ad: FusionAd) { listener?.onAdHidden(ad: ad) } public func adClicked(ad: FusionAd) { listener?.onAdClicked(ad: ad) } public func adLoadFailed(loadFailedInfo: LoadFailedInfo) { listener?.onAdLoadFailed(loadFailedInfo: loadFailedInfo) } public func adDisplayFailed(ad: FusionAd, error: FusionError?) { listener?.onAdDisplayFailed(ad: ad, error: error) } public func adRevenuePaid(ad: FusionAd) { listener?.onAdRevenuePaid(ad: ad) } public func adUserRewarded(ad: FusionAd, reward: FusionReward?) { listener?.onUserRewarded(ad: ad, reward: reward) } }