#import <UnityFramework/UnityFramework-Swift.h>

const char* ConvertToCString(NSString *str) {
    if (str == NULL) {
        return NULL;
    }

    const char* strUtf8 = [str UTF8String];

    char* cString = (char*)malloc(strlen(strUtf8) + 1);
    strcpy(cString, strUtf8);
    return cString;
}

NSString* ConvertToString(const char *str) {
    if (str == NULL) {
        return NULL;
    }

    return [NSString stringWithUTF8String:str];
}

extern "C"
{
    const char* Wortise_GetVersion() {
        NSString *version = [[WortiseSdk shared] getVersion];
        return ConvertToCString(version);
    }

    void Wortise_Initialize(const char* assetKey) {
        [[WortiseSdk shared] initialize:ConvertToString(assetKey)];
    }

    bool Wortise_IsInitialized() {
        return [[WortiseSdk shared] isInitialized];
    }

    bool Wortise_IsReady() {
        return [[WortiseSdk shared] isReady];
    }


    const char* Wortise_AdSettings_GetAssetKey() {
        NSString *assetKey = [[WortiseAdSettings shared] getAssetKey];
        return ConvertToCString(assetKey);
    }

    bool Wortise_AdSettings_GetChildDirected() {
        return [[WortiseAdSettings shared] getChildDirected];
    }

    const char* Wortise_AdSettings_GetMaxAdContentRating() {
        NSString *value = [[WortiseAdSettings shared] getMaxAdContentRating];
        return ConvertToCString(value);
    }
    
    bool Wortise_AdSettings_GetTestEnabled() {
        return [[WortiseAdSettings shared] getTestEnabled];
    }

    void Wortise_AdSettings_SetChildDirected(bool value) {
        [[WortiseAdSettings shared] setChildDirected:value];
    }

    void Wortise_AdSettings_SetMaxAdContentRating(const char* value) {
        [[WortiseAdSettings shared] setMaxAdContentRating:ConvertToString(value)];
    }

    void Wortise_AdSettings_SetTestEnabled(bool value) {
        [[WortiseAdSettings shared] setTestEnabled:value];
    }


    bool Wortise_ConsentManager_CanCollectData() {
        return [[WortiseConsentManager shared] canCollectData];
    }

    bool Wortise_ConsentManager_CanRequestPersonalizedAds() {
        return [[WortiseConsentManager shared] canRequestPersonalizedAds];
    }

    bool Wortise_ConsentManager_Exists() {
        return [[WortiseConsentManager shared] exists];
    }

    void Wortise_ConsentManager_Request(int id) {
        [[WortiseConsentManager shared] request:id];
    }

    void Wortise_ConsentManager_RequestIfRequired(int id) {
        [[WortiseConsentManager shared] requestIfRequired:id];
    }


    void Wortise_AppOpen_Create(int id, const char *adUnitId) {
        [[WortiseAppOpen shared] create:id adUnitId:ConvertToString(adUnitId)];
    }

    void Wortise_AppOpen_Destroy(int id) {
        [[WortiseAppOpen shared] destroy:id];
    }

    bool Wortise_AppOpen_GetAutoReload(int id) {
        return [[WortiseAppOpen shared] getAutoReload:id];
    }

    bool Wortise_AppOpen_IsAvailable(int id) {
        return [[WortiseAppOpen shared] isAvailable:id];
    }

    bool Wortise_AppOpen_IsDestroyed(int id) {
        return [[WortiseAppOpen shared] isDestroyed:id];
    }

    bool Wortise_AppOpen_IsShowing(int id) {
        return [[WortiseAppOpen shared] isShowing:id];
    }

    void Wortise_AppOpen_LoadAd(int id) {
        [[WortiseAppOpen shared] loadAd:id];
    }

    void Wortise_AppOpen_SetAutoReload(int id, bool value) {
        [[WortiseAppOpen shared] setAutoReload:id value:value];
    }

    void Wortise_AppOpen_ShowAd(int id) {
        [[WortiseAppOpen shared] showAd:id];
    }

    void Wortise_AppOpen_TryToShowAd(int id) {
        [[WortiseAppOpen shared] tryToShowAd:id];
    }


    void Wortise_Banner_Create(int         id,
                               const char *adUnitId,
                               int         adWidth,
                               int         adHeight,
                               const char *adType,
                               int         adPosition) {

        [[WortiseBanner shared] create:id
                                adUnitId:ConvertToString(adUnitId)
                                adWidth:adWidth
                                adHeight:adHeight
                                adType:ConvertToString(adType)
                                adPosition: adPosition];
    }

    void Wortise_Banner_Destroy(int id) {
        [[WortiseBanner shared] destroy:id];
    }

    long Wortise_Banner_GetAdHeight(int id) {
        return [[WortiseBanner shared] getAdHeight:id inPixels:false];
    }

    long Wortise_Banner_GetAdHeightPx(int id) {
        return [[WortiseBanner shared] getAdHeight:id inPixels:true];
    }

    long Wortise_Banner_GetAdWidth(int id) {
        return [[WortiseBanner shared] getAdWidth:id inPixels:false];
    }

    long Wortise_Banner_GetAdWidthPx(int id) {
        return [[WortiseBanner shared] getAdWidth:id inPixels:true];
    }

    long Wortise_Banner_GetAutoRefreshTime(int id) {
        return [[WortiseBanner shared] getAutoRefreshTime:id];
    }

    bool Wortise_Banner_IsAutoRefreshEnabled(int id) {
        return [[WortiseBanner shared] isAutoRefreshEnabled:id];
    }

    bool Wortise_Banner_IsDestroyed(int id) {
        return [[WortiseBanner shared] isDestroyed:id];
    }

    bool Wortise_Banner_IsLoading(int id) {
        return [[WortiseBanner shared] isLoading:id];
    }

    void Wortise_Banner_LoadAd(int id) {
        [[WortiseBanner shared] loadAd:id];
    }

    void Wortise_Banner_SetAutoRefreshTime(int id, long value) {
        [[WortiseBanner shared] setAutoRefreshTime:id value:value];
    }


    void Wortise_Interstitial_Create(int id, const char *adUnitId) {
        [[WortiseInterstitial shared] create:id adUnitId:ConvertToString(adUnitId)];
    }

    void Wortise_Interstitial_Destroy(int id) {
        [[WortiseInterstitial shared] destroy:id];
    }

    bool Wortise_Interstitial_IsAvailable(int id) {
        return [[WortiseInterstitial shared] isAvailable:id];
    }

    bool Wortise_Interstitial_IsDestroyed(int id) {
        return [[WortiseInterstitial shared] isDestroyed:id];
    }

    bool Wortise_Interstitial_IsShowing(int id) {
        return [[WortiseInterstitial shared] isShowing:id];
    }

    void Wortise_Interstitial_LoadAd(int id) {
        [[WortiseInterstitial shared] loadAd:id];
    }

    void Wortise_Interstitial_ShowAd(int id) {
        [[WortiseInterstitial shared] showAd:id];
    }


    void Wortise_Rewarded_Create(int id, const char *adUnitId) {
        [[WortiseRewarded shared] create:id adUnitId:ConvertToString(adUnitId)];
    }

    void Wortise_Rewarded_Destroy(int id) {
        [[WortiseRewarded shared] destroy:id];
    }

    bool Wortise_Rewarded_IsAvailable(int id) {
        return [[WortiseRewarded shared] isAvailable:id];
    }

    bool Wortise_Rewarded_IsDestroyed(int id) {
        return [[WortiseRewarded shared] isDestroyed:id];
    }

    bool Wortise_Rewarded_IsShowing(int id) {
        return [[WortiseRewarded shared] isShowing:id];
    }

    void Wortise_Rewarded_LoadAd(int id) {
        [[WortiseRewarded shared] loadAd:id];
    }

    void Wortise_Rewarded_ShowAd(int id) {
        [[WortiseRewarded shared] showAd:id];
    }
}
