export enum EventTypes {
  // ClearStores event is used to inform the stores that _all_ the data they are using
  // is now out of date and they should refresh - This is used when the user makes large
  // changes to the data such as bulk actions or importing a CSV file
  ClearStores,
}

export type EventFn = () => void;

export interface IEventBus {
  on(event: EventTypes, fn: EventFn, key: string): void;
  off(event: EventTypes, key: string): void;
  emit(event: EventTypes): void;
}

class EventBus implements IEventBus {
  private listeners: Record<EventTypes, Record<string, EventFn>> = {
    [EventTypes.ClearStores]: {},
  };

  on(event: EventTypes, fn: EventFn, key: string): void {
    this.listeners[event][key] = fn;
  }

  off(event: EventTypes, key: string): void {
    delete this.listeners[event][key];
  }

  emit(event: EventTypes): void {
    Object.values(this.listeners[event]).forEach(fn => fn());
  }
}

const bus = new EventBus();

export function useEventBus(): IEventBus {
  return bus;
}