#import <Foundation/Foundation.h>

/// Positions to place an ad.
typedef NS_ENUM(NSInteger, BSUAdPosition) {
    kBSUAdPositionTopOfScreen = 0,          ///< Top of screen.
    kBSUAdPositionBottomOfScreen = 1       ///< Bottom of screen.
  };

/// Base type representing a BSU* pointer.

typedef const void *BSUTypeRef;
typedef const void *BSUTypeErrorRef;
typedef const void *BSUTypeSettingsRef;
typedef const void *BSUTypeRequestOptionsRef;
typedef const void *BSUTypeMobileAdsClientRef;
typedef const void *BSUTypeInitializationStatusRef;
typedef void (*BSUAdaptersInitializationCompleteCallback)(BSUTypeMobileAdsClientRef *clientRef,
                                                   BSUTypeInitializationStatusRef statusRef);
typedef void (*BSUSDKInitializationCompleteCallback)(BSUTypeMobileAdsClientRef *clientRef, BOOL success, BSUTypeErrorRef error);


typedef const void *BSUTypeRewardedVideoAdRef;
typedef const void *BSUTypeRewardedVideoAdClientRef;
typedef void (*BSUOnRewardedVideoLoadedCallback)(BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient);
typedef void (*BSUOnRewardedVideoErrorCallback)(
    BSUTypeRewardedVideoAdClientRef *rewardedClient, BSUTypeErrorRef error);
typedef void (*BSUOnRewardedVideoClickedCallback)(BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient);
typedef void (*BSUOnRewardedVideoClosedCallback)(BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient);
typedef void (*BSUOnRewardedVideoAppearedCallback)(BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient);
typedef void (*BSUOnUserRewardEarnedCallback)(
    BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient, const char* rewardType, int rewardAmount);


typedef const void *BSUTypeInterstitialRef;
typedef const void *BSUTypeInterstitialClientRef;
typedef void (*BSUOnInterstitialDidLoadedCallback)(BSUTypeInterstitialClientRef *interstitialClient);
typedef void (*BSUOnInterstitialDidFailCallback)(
    BSUTypeInterstitialClientRef *interstitialClient, BSUTypeErrorRef error);
typedef void (*BSUOnInterstitialClickedCallback)(BSUTypeInterstitialClientRef *interstitialClient);
typedef void (*BSUOnInterstitialDisappearCallback)(BSUTypeInterstitialClientRef *interstitialClient);
typedef void (*BSUOnInterstitialDidShownCallback)(BSUTypeInterstitialClientRef *interstitialClient);


typedef const void *BSUTypeBannerRef;
typedef const void *BSUTypeBannerClientRef;
typedef void (*BSUOnBannerDidLoadCallback)(BSUTypeBannerClientRef *bannerClient);
typedef void (*BSUOnBannerDidFailedCallback)(BSUTypeBannerClientRef *bannerClient, BSUTypeErrorRef error);
typedef void (*BSUOnAdClickedCallback)(BSUTypeBannerClientRef *bannerClient);
typedef void (*BSUOnBannerDidRefreshCallback)(BSUTypeBannerClientRef *bannerClient);
typedef void (*BSUOnBannerDidFailToRefreshCallback)(BSUTypeBannerClientRef *bannerClient,BSUTypeErrorRef error);
typedef void (*BSUOnBannerHideCallback)(BSUTypeBannerClientRef *bannerClient);
typedef void (*BSUOnBannerDisplayCallback)(BSUTypeBannerClientRef *bannerClient);


typedef const void *BSUTypeNativeAdRef;
typedef const void *BSUTypeNativeAdClientRef;
typedef void (*BSUOnNativeAdDidLoadCallback)(BSUTypeNativeAdClientRef *nativeAdClient);
typedef void (*BSUOnNativeAdDidFailCallback)(
    BSUTypeNativeAdClientRef *nativeAdClient, BSUTypeErrorRef error);
typedef void (*BSUOnNativeAdDidRecordImpressionCallback)(BSUTypeNativeAdClientRef *nativeAdClient);
typedef void (*BSUOnNativeAdDidPerformClickCallback)(BSUTypeNativeAdClientRef *nativeAdClient);
typedef void (*BSUOnNativeAdCloseCallback)(BSUTypeNativeAdClientRef *nativeAdClient);
