// 存储一个事件回调数组
const listeners: { [key: string]: any[] } = {};

// 触发事件的函数
function triggerEvent(key: string, data: any) {
  if (listeners[key]) {
    listeners[key].forEach((callback: any) => {
      callback(data);
    });
  }
  // 也可以触发一个通用的 'change' 事件
  if (listeners['change']) {
    listeners['change'].forEach((callback: any) => {
      callback({ key, data });
    });
  }
}

type IFun = Function & { $$functionKey?: string };

/**
 * isLogin 的数据类型
 */
export type IIsLogin = boolean;

export const Subscribe = {
  /**
   * 设置
   * @param key 订阅变量的key
   * @param value 值
   */
  set<T>(key: string, value: T) {
    // 1. 执行原有的存储操作
    // setStorage(key, value);
    // 2. 触发自定义事件，通知订阅者
    triggerEvent(key, value);
  },

  // get(key: string) {
  //   return getStorage(key);
  // },

  /**
   * 批量移除订阅
   * @param key 订阅变量的key
   */
  remove(key: string) {
    triggerEvent(key, null); // 或者触发一个 'remove' 事件
  },

  /**
   * 订阅事件
   * @param key 订阅变量的key
   * @param functionKey 唯一的函数key(用于取消订阅的)
   * @param callback 回调函数
   */
  on<T>(key: string, functionKey: string, callback: (data: T) => void) {
    if (!listeners[key]) {
      listeners[key] = [];
    }
    if (typeof callback == 'function') {
      (callback as IFun)['$$functionKey'] = functionKey;
      listeners[key].push(callback);
    } else {
      console.log('订阅事件 callback 必须是函数');
    }
  },

  /**
   * 取消订阅
   * @param key 订阅变量的key
   * @param functionKey 唯一的函数key(用于取消订阅的)
   */
  off(key: string, functionKey: string) {
    if (!listeners[key]) return;
    listeners[key] = listeners[key].filter((cb: IFun) => cb.$$functionKey != functionKey);
    if (listeners[key].length == 0) {
      delete listeners[key];
    }
  },
};
