import { BlazeGlobalEvents, BlazeContentExtraInfo } from "@wscsports/blaze-rtn-sdk";

export type BlazeBannerAdEventType =
    | 'adLoaded'
    | 'adClicked'
    | 'adImpression'
    | 'adRequested';

interface BlazeGAMBannerAdsDelegateOnAdEventParams {
    eventType: BlazeBannerAdEventType;
}

export interface BlazeGAMBannerAdsDelegate {

    /**
     * This function will be triggered every time an event on an ad will happen.
     * 
     * @param params The data associated with the ad involved in the event.
     */
    onGAMBannerAdsAdEvent?: (params: BlazeGAMBannerAdsDelegateOnAdEventParams) => void;

    /**
     * Called when an error occurs during ad loading or playback.
     * 
     * @param errorMessage The error message associated with the error.
     */
    onGAMBannerAdsAdError?: (errorMessage: string) => void;

}

export class BlazeBannerAdsDelegateHelper {

    static registerDelegate(delegate?: BlazeGAMBannerAdsDelegate | null) {
        // Register event listeners for regular events
        BlazeBannerAdsDelegateHelper.onGAMBannerAdsAdEvent(delegate?.onGAMBannerAdsAdEvent)
        BlazeBannerAdsDelegateHelper.onGAMBannerAdsAdError(delegate?.onGAMBannerAdsAdError)
    }

    private static onGAMBannerAdsAdEvent(
        callback?: (params: BlazeGAMBannerAdsDelegateOnAdEventParams) => void,
    ) {
        const eventName = 'BlazeGAM.onGAMBannerAdsAdEvent'
        if (callback) {
            BlazeGlobalEvents.createEventSubscription(
                eventName,
                (data: any) => {
                    try {
                        const eventType = data['eventType'];
                        callback({
                            eventType
                        });
                    } catch (e) {
                        console.error('onGAMBannerAdsAdEvent', e);
                    }
                },
            );
        } else {
            BlazeGlobalEvents.cancelEventSubscription(eventName)
        }
    }

    private static onGAMBannerAdsAdError(
        callback?: (errorMessage: string) => void,
    ) {
        const eventName = 'BlazeGAM.onGAMBannerAdsAdError'
        if (callback) {
            BlazeGlobalEvents.createEventSubscription(
                eventName,
                (data: any) => {
                    try {
                        const errorMessage = data['errorMessage'];
                        callback(errorMessage);
                    } catch (e) {
                        console.error('onGAMBannerAdsAdError', e);
                    }
                },
            );
        } else {
            BlazeGlobalEvents.cancelEventSubscription(eventName)
        }
    }

}