//Used by VrtcalExterns.cs
//Defines the Objective-C to C bridge

//Dependencies
#import "VRTUManager.h"
#import "VRTUTypes.h"

extern "C" {
    
    /// Converts Unity strings to NSStrings by copying the characters from |bytes|, a C array of UTF8-encoded bytes.
    /// Returns nil if |bytes| is NULL.
    static NSString *VRTStringFromUTF8String(const char *bytes) { return bytes ? @(bytes) : nil; }

    void VRTUInitializeSdk(
        NSInteger appId, 

        VRTUSdkInitializedCallback sdkInitializedCallback,
        VRTUSdkInitializationFailedWithErrorCallback sdkInitializationFailedWithErrorCallback,

        VRTUCallback bannerAdLoadedCallback,
        VRTUErrorCallback bannerAdFailedToLoadCallback,
        VRTUCallback bannerVideoStartedCallback,
        VRTUCallback bannerVideoCompletedCallback,
        VRTUCallback bannerAdClickedCallback,
        VRTUCallback bannerAdWillLeaveApplicationCallback,
        VRTUCallback bannerAdWillPresentModalCallback,
        VRTUCallback bannerAdDidPresentModalCallback,
        VRTUCallback bannerAdWillDismissModalCallback,
        VRTUCallback bannerDidDismissModalCallback,

        VRTUCallback interstitialAdLoadedCallback,
        VRTUErrorCallback interstitialAdFailedToLoadCallback,
        VRTUCallback interstitialAdWillShowCallback,
        VRTUCallback interstitialAdDidShowCallback,
        VRTUErrorCallback interstitialAdFailedToShowCallback,        
        VRTUCallback interstitialVideoStartedCallback,
        VRTUCallback interstitialVideoCompletedCallback,
        VRTUCallback interstitialAdClickedCallback,
        VRTUCallback interstitialAdWillLeaveApplicationCallback,
        VRTUCallback interstitialAdWillDismissCallback,
        VRTUCallback interstitialAdDidDismissCallback
    ) {
        NSLog(@"VRTUInitializeSdkWithAppId");
        
        //Map SDK Init callbacks
        [VRTUManager singleton].sdkInitializedCallback = sdkInitializedCallback;
        [VRTUManager singleton].sdkInitializationFailedWithErrorCallback = sdkInitializationFailedWithErrorCallback;
        
        //Map Banner Callbacks
        [VRTUManager singleton].bannerAdLoadedCallback = bannerAdLoadedCallback;
        [VRTUManager singleton].bannerAdFailedToLoadCallback = bannerAdFailedToLoadCallback;
        [VRTUManager singleton].bannerVideoStartedCallback = bannerVideoStartedCallback;
        [VRTUManager singleton].bannerVideoCompletedCallback = bannerVideoCompletedCallback;
        [VRTUManager singleton].bannerAdClickedCallback = bannerAdClickedCallback;
        [VRTUManager singleton].bannerAdWillLeaveApplicationCallback = bannerAdWillLeaveApplicationCallback;
        [VRTUManager singleton].bannerAdWillPresentModalCallback = bannerAdWillPresentModalCallback;
        [VRTUManager singleton].bannerAdDidPresentModalCallback = bannerAdDidPresentModalCallback;
        [VRTUManager singleton].bannerAdWillDismissModalCallback = bannerAdWillDismissModalCallback;
        [VRTUManager singleton].bannerAdDidDismissModalCallback = bannerDidDismissModalCallback;

        //Map Interstitial Callbacks
        [VRTUManager singleton].interstitialAdLoadedCallback = interstitialAdLoadedCallback;
        [VRTUManager singleton].interstitialAdFailedToLoadCallback = interstitialAdFailedToLoadCallback;
        [VRTUManager singleton].interstitialAdWillShowCallback = interstitialAdWillShowCallback;
        [VRTUManager singleton].interstitialAdDidShowCallback = interstitialAdDidShowCallback;
        [VRTUManager singleton].interstitialVideoStartedCallback = interstitialVideoStartedCallback;
        [VRTUManager singleton].interstitialVideoCompletedCallback = interstitialVideoCompletedCallback;
        [VRTUManager singleton].interstitialAdFailedToShowCallback = interstitialAdFailedToShowCallback;
        [VRTUManager singleton].interstitialAdClickedCallback = interstitialAdClickedCallback;
        [VRTUManager singleton].interstitialAdWillLeaveApplicationCallback = interstitialAdWillLeaveApplicationCallback;
        [VRTUManager singleton].interstitialAdWillDismissCallback = interstitialAdWillDismissCallback;
        [VRTUManager singleton].interstitialAdDidDismissCallback = interstitialAdDidDismissCallback;

        //Init SDK
        [[VRTUManager singleton] initializeSdkWithAppId:appId];
    }

    #pragma mark - PII
    void VRTUSetPiiData(const char *piiData) {
        NSString *strPiiData = VRTStringFromUTF8String(piiData);
        [[VRTUManager singleton] setPiiData: strPiiData];
    }

    void VRTUSetPiiDataTypes(const char *piiDataTypes) {
        NSString *strPiiDataTypes = VRTStringFromUTF8String(piiDataTypes);
        [[VRTUManager singleton] setPiiDataTypes: strPiiDataTypes];
    }

    #pragma mark - Banner
    void VRTUBannerLoad(int zoneId, float x, float y, float width, float height) {
        [[VRTUManager singleton] bannerLoadWithZoneId:zoneId frame:CGRectMake(x,y,width,height)];
    }

    void VRTUBannerLoadTop(int zoneId, float width, float height) {
        [[VRTUManager singleton] bannerLoadWithZoneId:zoneId position:VRTBannerPositionTop size:CGSizeMake(width,height)];
    }

    void VRTUBannerLoadBottom(int zoneId, float width, float height) {
        [[VRTUManager singleton] bannerLoadWithZoneId:zoneId position:VRTBannerPositionBottom size:CGSizeMake(width,height)];
    }    

    void VRTUBannerMove(int zoneId, float x, float y) {
        [[VRTUManager singleton] bannerMoveWithZoneId:zoneId origin:CGPointMake(x,y)];
    }

    void VRTUBannerDestroy(int zoneId) {
        [[VRTUManager singleton] bannerDestroyWithZoneId:zoneId];
    }

    

    #pragma mark - Interstitial
    void VRTUInterstitialLoad(int zoneId) {
        [[VRTUManager singleton] interstitialLoadWithZoneId:zoneId];
    }
         
    void VRTUInterstitialShow(int zoneId) {
        [[VRTUManager singleton] interstitialShowWithZoneId:zoneId];
    }

    void VRTUInterstitialDestroy(int zoneId) {
        [[VRTUManager singleton] interstitialDestroyWithZoneId:zoneId];
    }
}
