//
//  BSUInterface.h
//  BlueStack
//
//  Created by Nagib Bin Azad on 11/21/22.
//
#import <Foundation/Foundation.h>
#import "BSUObjectCache.h"
#import "BSUTypes.h"
#import <CoreLocation/CoreLocation.h>
#import <BlueStackSDK/BlueStackSDK-Swift.h>
@class BSURequestOptions;

// Override BSUTypeRequestOptionsRef to use our BSURequestOptions class instead of void*
//#undef BSUTypeRequestOptionsRef
//typedef BSURequestOptions *BSUTypeRequestOptionsRef;

// Common
static NSString *BSUStringFromUTF8String(const char *bytes);
static const char *cStringCopy(const char *string);
static const char **cStringArrayCopy(NSArray *array);
void BSURelease(BSUTypeRef ref);

// Error
int BSUGetAdErrorCode(BSUTypeErrorRef error);
const char *BSUGetAdErrorDomain(BSUTypeErrorRef error);
const char *BSUGetAdErrorMessage(BSUTypeErrorRef error);

// Initialization
void BSUInitializeWithCallback(BSUTypeMobileAdsClientRef *mobileAdsClientRef, const char *appId, BSUTypeSettingsRef settingsRef, BSUSDKInitializationCompleteCallback sdkInitCallback, BSUAdaptersInitializationCompleteCallback adaptersInitCallback);
NSDictionary *classNameKeyedDictionaryFromArray(NSArray *array);
int BSUGetInitState(BSUTypeInitializationStatusRef statusRef, const char *className);
const char **BSUGetInitAdapterClasses(BSUTypeInitializationStatusRef statusRef);
int BSUGetInitNumberOfAdapterClasses(BSUTypeInitializationStatusRef statusRef);
const char *BSUGetInitDescription(BSUTypeInitializationStatusRef statusRef,
                                  const char *className);
const char *BSUGetInitProviderName(BSUTypeInitializationStatusRef statusRef,
                                   const char *className);
// Settings
BSUTypeSettingsRef BSUCreateSettings();
void BSUSetDebugModeEnabled(BSUTypeSettingsRef settingsRef, BOOL debugModeEnabled);

// RequestOptions
BSUTypeRequestOptionsRef BSUCreateRequestOptions();
void BSUSetGender(BSUTypeRequestOptionsRef requestOptionsRef, int gender);
void BSUSetAge(BSUTypeRequestOptionsRef requestOptionsRef, int age);
void BSUSetLocation(BSUTypeRequestOptionsRef requestOptionsRef, double latitude, double longitude, int consentFlag);
void BSULanguage(BSUTypeRequestOptionsRef requestOptionsRef, const char *language);
void BSUSetKeyword(BSUTypeRequestOptionsRef requestOptionsRef, const char *keyword);
void BSUSetContentUrl(BSUTypeRequestOptionsRef requestOptionsRef, const char *contentUrl);
void BSUDestroyRequestOptions(BSUTypeRequestOptionsRef requestOptionsRef);

// Rewarded Video Ad
void BSUSetRewardedVideoAdCallbacks(BSUTypeRewardedVideoAdRef rewardedVideoAd,
                                    BSUOnRewardedVideoLoadedCallback
                                    onLoadAdCallback,
                                    BSUOnRewardedVideoErrorCallback
                                    onErrorCallback,
                                    BSUOnRewardedVideoClickedCallback
                                    onClickedCallback,
                                    BSUOnRewardedVideoClosedCallback
                                    onAdClosedCallback,
                                    BSUOnRewardedVideoAppearedCallback
                                    onAdAppearedCallback,
                                    BSUOnUserRewardEarnedCallback
                                    onRewardEarnedCallback);

BSUTypeRewardedVideoAdRef BSUCreateRewardedVideoAd(BSUTypeRewardedVideoAdClientRef *rewardedVideoAdClient, const char *placementId);
void BSULoadRewardedVideoAd(BSUTypeRewardedVideoAdRef rewardedVideoAd);
void BSULoadRewardedVideoAdWithRequestOptions(BSUTypeRewardedVideoAdRef rewardedVideoAd, BSUTypeRequestOptionsRef requestOptionsRef);
void BSUShowRewardedVideoAd(BSUTypeRewardedVideoAdRef rewardedVideoAd);
void BSUDestroyRewardedVideoAd(BSUTypeRewardedVideoAdRef rewardedVideoAd);

// Interstitial Ad
void BSUSetInterstitialAdCallbacks(BSUTypeInterstitialRef interstitial,
                                   BSUOnInterstitialDidLoadedCallback
                                   onDidLoadedCallback,
                                   BSUOnInterstitialDidFailCallback
                                   onDidFailCallback,
                                   BSUOnInterstitialClickedCallback
                                   onClickedCallback,
                                   BSUOnInterstitialDisappearCallback
                                   onDisappearCallback,
                                   BSUOnInterstitialDidShownCallback
                                   onDidShownCallback);
BSUTypeInterstitialRef BSUCreateInterstitialAd(BSUTypeInterstitialClientRef *interstitialClient, const char *placementId);
void BSULoadInterstitialAd(BSUTypeInterstitialRef interstitial);
void BSULoadInterstitialAdWithRequestOptions(BSUTypeInterstitialRef interstitial, BSUTypeRequestOptionsRef requestOptionsRef);
void BSUShowInterstitialAd(BSUTypeInterstitialRef interstitial);
void BSUDestroyInterstitialAd(BSUTypeInterstitialRef interstitial);

// Banner Ad
BSUTypeBannerRef BSUCreateBannerAd(BSUTypeBannerClientRef *bannerClient, const char *placementId, BSUAdPosition adPosition);
void BSUSetBannerAdCallbacks(BSUTypeBannerRef banner,
                             BSUOnBannerDidLoadCallback onBannerDidLoadCallback,
                             BSUOnBannerDidFailedCallback onBannerDidFailedCallback,
                             BSUOnAdClickedCallback onAdClickedCallback,
                             BSUOnBannerDidRefreshCallback onBannerDidRefreshCallback,
                             BSUOnBannerDidFailToRefreshCallback onBannerDidFailToRefreshCallback,
                             BSUOnBannerHideCallback onBannerHideCallback,
                             BSUOnBannerDisplayCallback onBannerDisplayCallback);
void BSULoadBannerAd(BSUTypeBannerRef banner, const char *adSize);
void BSULoadBannerAdWithRequestOptions(BSUTypeBannerRef banner, const char *adSize, BSUTypeRequestOptionsRef requestOptionsRef);
void BSUHideBannerAd(BSUTypeBannerRef banner);
void BSUShowBannerAd(BSUTypeBannerRef banner);
void BSUSetBannerAdPosition(BSUTypeBannerRef banner, BSUAdPosition adPosition);
void BSUDestroyBannerAd(BSUTypeBannerRef banner);

// Native Ad
void BSUSetNativeAdCallbacks(BSUTypeNativeAdRef nativeAd,
                                BSUOnNativeAdDidLoadCallback
                                onDidLoadCallback,
                                BSUOnNativeAdDidFailCallback
                                onDidFailCallback,
                                BSUOnNativeAdDidRecordImpressionCallback
                                onRecordImpressionCallback,
                                BSUOnNativeAdDidPerformClickCallback
                                onPerformClickCallback,
                                BSUOnNativeAdCloseCallback
                                onCloseCallback);
BSUTypeNativeAdRef BSUCreateNativeAd(BSUTypeNativeAdClientRef *nativeAdClient, const char *placementId);
void BSULoadNativeAd(BSUTypeNativeAdRef nativeAd);
void BSULoadNativeAdWithRequestOptions(BSUTypeNativeAdRef nativeAd, BSUTypeRequestOptionsRef requestOptionsRef);
const char *BSUNativeAdGetTitle(BSUTypeNativeAdRef nativeAd);
const char *BSUNativeAdGetBodyText(BSUTypeNativeAdRef nativeAd);
const char *BSUNativeAdGetCTAText(BSUTypeNativeAdRef nativeAd);
void BSURecordImpression(BSUTypeNativeAdRef nativeAd);
void BSUPerformClick(BSUTypeNativeAdRef nativeAd);
void BSUDestroyNativeAd(BSUTypeNativeAdRef nativeAd);
