import {
  NativeModulesStatic,
  NativeModules,
} from 'react-native';
import {
  BlazeIMADelegate,
  BlazeGlobalDelegateHelper
} from './BlazeIMADelegate';

interface BlazeIMAEnableAdsOptions {

  /**
   * This delegate will be invoked upon different events.
   */
  delegate?: BlazeIMADelegate | null

}

interface BlazeIMAInterface {

  /**
   * Call this function to enable Google IMA ads.
   * 
   * @param options 
   */
  enableAds(
    options: BlazeIMAEnableAdsOptions
  ): void;

  /**
   * Call this function to disable Google IMA ads.
   */
  disableAds(): void;

}

interface BlazeIMAInterfaceInternal extends NativeModulesStatic {
  enableAds(): void;
  disableAds(): void;
}

const { RTNBlazeIMA } = NativeModules;
const BlazeIMANativeModule = RTNBlazeIMA as BlazeIMAInterfaceInternal;

// This wrapper is hiding the internal interface that works with the native module, and serves as additional layer to add custom logic.
class BlazeIMAWrapper implements BlazeIMAInterface {

  enableAds(
    options: BlazeIMAEnableAdsOptions
  ): void {
    BlazeIMANativeModule.enableAds();
    BlazeGlobalDelegateHelper.registerDelegate(options.delegate)
  }

  disableAds(): void {
    BlazeIMANativeModule.disableAds()
  }

  // Singleton instance
  private static instance: BlazeIMAWrapper;

  // Private constructor for singleton
  private constructor() { }

  // Method to get singleton instance
  public static getInstance(): BlazeIMAWrapper {
    if (!this.instance) {
      this.instance = new BlazeIMAWrapper();
    }
    return this.instance;
  }

}

export const BlazeIMA = BlazeIMAWrapper.getInstance() as BlazeIMAInterface;
