import { RegisterGlobalEvents } from "./utils/RegisterGlobalEvents";

export type BlazeOnAdEventEventType =
  | 'openedAd'
  | 'adPageStart'
  | 'adPageFirstQuarter'
  | 'adPageThird'
  | 'adPageMid'
  | 'adPageComplete'
  | 'pausedAdPage'
  | 'resumedAdPage'
  | 'ctaClicked';

interface BlazeGAMDelegateOnAdEventParams {
  eventType: BlazeOnAdEventEventType;
}

export interface BlazeGAMDelegate {
  onGAMAdEvent?: (params: BlazeGAMDelegateOnAdEventParams) => void
  onGAMAdError?: (errorMessage: string) => void
}

export class BlazeGlobalDelegateHelper {

  static registerDelegate(delegate?: BlazeGAMDelegate | null) {
      BlazeGlobalDelegateHelper.onGAMAdEvent(delegate?.onGAMAdEvent)
      BlazeGlobalDelegateHelper.onGAMAdError(delegate?.onGAMAdError)
  }

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

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

}