import { type EmitterSubscription, NativeEventEmitter } from 'react-native';
import type { NativeModule } from 'react-native/Libraries/EventEmitter/NativeEventEmitter';

export class TapsellEventEmitter {
  private readonly emitter: NativeEventEmitter | undefined;
  private subscriptions: Map<string, EmitterSubscription> = new Map();

  constructor(nativeModule: NativeModule) {
    try {
      this.emitter = new NativeEventEmitter(nativeModule);
    } catch (e) {
      console.error('Failed to initialize native event emitter:', e);
    }
  }

  public addListener(
    eventType: string,
    listener: (...args: any[]) => void
  ): void {
    if (this.emitter) {
      const subscription = this.emitter.addListener(eventType, listener);
      this.subscriptions.set(eventType, subscription);
    } else {
      console.warn(
        'Native event emitter is not available. Listener not added.'
      );
    }
  }

  public removeListener(eventType: string): void {
    const subscription = this.subscriptions.get(eventType);
    if (subscription) {
      subscription.remove();
      this.subscriptions.delete(eventType);
    }
  }

  public removeAllListeners(): void {
    this.subscriptions.forEach((subscription) => subscription.remove());
    this.subscriptions.clear();
  }
}
