class EventRegister {
  static _Listeners = {
    count: 0,
    refs: {} as { [key: string]: any }
  };

  static addEventListener(
    eventName: string,
    callback: (status: boolean) => any
  ) {
    EventRegister._Listeners.count++;
    const eventId = "l" + EventRegister._Listeners.count;
    EventRegister._Listeners.refs[eventId] = {
      name: eventName,
      callback
    };
    return eventId;
  }

  static removeEventListener(id: string) {
    return delete EventRegister._Listeners.refs[id];
  }

  static removeAllListeners() {
    let removeError = false;
    Object.keys(EventRegister._Listeners.refs).forEach(_id => {
      const removed = delete EventRegister._Listeners.refs[_id];
      removeError = !removeError ? !removed : removeError;
    });
    return !removeError;
  }

  static emitEvent(eventName: string, data: any) {
    Object.keys(EventRegister._Listeners.refs).forEach(_id => {
      if (
        EventRegister._Listeners.refs[_id] &&
        eventName === EventRegister._Listeners.refs[_id].name
      )
        EventRegister._Listeners.refs[_id].callback(data);
    });
  }

  /**
   * listen follow Merchant or Member Card event
   * @param id Merchant Id or Member Card Id
   * @param callback
   */
  static onFollow(id: string, callback: (isFollowing: boolean) => any) {
    return EventRegister.addEventListener("follow" + id, callback);
  }

  /**
   * listen like Promo event
   * @param id Promo Id
   * @param callback
   */
  static onLike(id: string, callback: (isLiked: boolean) => any) {
    return EventRegister.addEventListener("like" + id, callback);
  }

  /**
   * trigger follow Merchant or Member Card event
   * @param id Merchant Id or Member Card Id
   * @param isFollowing
   */
  static follow(id: string, isFollowing: boolean) {
    EventRegister.emitEvent("follow" + id, isFollowing);
  }

  /**
   * trigger like Promo event
   * @param id Promo Id
   * @param isLiked
   */
  static like(id: string, isLiked: boolean) {
    EventRegister.emitEvent("like" + id, isLiked);
  }

  /**
   * listen view promo
   * @param id Merchant Id or Member Card Id
   * @param callback
   */
  static onView(id: string, callback: (isViewed: boolean) => any) {
    return EventRegister.addEventListener("view" + id, callback);
  }
  /**
   * trigger view promo event
   * @param id Promo Id
   * @param isLiked
   */
  static view(id: string) {
    EventRegister.emitEvent("view" + id, true);
  }

  /**
   * listen view promo
   * @param id Merchant Id or Member Card Id
   * @param callback
   */
  static onViewPromoDetail(id: string, callback: (lovedStatus: object) => any) {
    console.log("View Promo Detail Listened")
    return EventRegister.addEventListener("viewPromoDetail" + id, callback);
  }
  /**
   * trigger view promo detail event
   * @param id Promo Id
   * @param lovedStatus an object that contain isLoved and totalLovers attribute
   */
  static viewPromoDetail(id: string, lovedStatus: object) {
    console.log("View Promo Detail")
    EventRegister.emitEvent("viewPromoDetail" + id, lovedStatus);
  }
}

export { EventRegister };
