/** pomelo事件管理器 */

export default class {
	constructor() {
		/** 服务器名称 */
		this.serverName = '';
	};

	/**
	* 注册事件
	* @param {String} event 事件名称
	* @param {Function} fn 事件回调
	*/
	on(event, fn) {
		this.addEventListener(event, fn);
	};

	/**
	* 注册事件（和on一毛一样，为啥要两个？）
	* @param {String} event 事件名称
	* @param {Function} fn 事件回调
	*/
	addEventListener(event, fn) {
		this._callbacks = this._callbacks || {};
		(this._callbacks[event] = this._callbacks[event] || []).push(fn);

		return this;
	};

	/**
	* 添加只触发一次的事件侦听器
	* @param {String} event
	* @param {Function} fn
	*/
	once(event, fn) {
		var self = this;
		this._callbacks = this._callbacks || {};

		function on() {
			self.off(event, on);
			fn.apply(this, arguments);
		};

		on.fn = fn;
		this.on(event, on);
		return this;
	};

	/**
	 * 移除事件（如果不指定事件回调，并且有多个on监听，则移除第一个）
	 * @param {String} event 事件名称
	 * @param {Function} fn 事件回调
	 */
	off(event, fn) {
		this.removeEventListener(event, fn);
	};

	/**
	 * 移除指定事件
	 * @param {String} event 事件名称
	 */
	removeListener(event) {
		this.removeEventListener(event);
	};

	/** 清除所有事件 */
	removeAllListeners() {
		this.removeEventListener();
	};

	/**
	* 移除指定事件
	* @param {String} event 事件名称
	* @param {Function} fn 事件回调
	*/
	removeEventListener(event, fn) {
		this._callbacks = this._callbacks || {};

		// 如果不指定参数，就是移除所有
		if (!event) {
			this._callbacks = {};
			return this;
		};

		// 查看有没有指定事件名的处理函数
		var callbacks = this._callbacks[event];
		if (!callbacks) return this;

		// 移除指定事件名的所有处理函数
		if (!fn) {
			delete this._callbacks[event];
			return this;
		};

		// 移除指定的事件处理函数
		var cb;
		for (var i = 0; i < callbacks.length; i++) {
			cb = callbacks[i];
			if (cb === fn || cb.fn === fn) {
				callbacks.splice(i, 1);
				break;
			};
		};

		return this;
	};

	/**
	* 使用给定的参数触发事件
	* @param {String} event
	* @param {Mixed} ...
	*/
	emit(event) {
		this._callbacks = this._callbacks || {};
		// 获取参数
		var args = [].slice.call(arguments, 1);
		// 获取所有的回调，并调用所有函数
		var callbacks = this._callbacks[event];

		// 执行事件回调函数
		if (callbacks) {
			callbacks = callbacks.slice(0);
			for (var i = 0, len = callbacks.length; i < len; ++i) {
				callbacks[i].apply(this, args);
			};
		};

		return this;
	};

	/**
	 * 获取事件的回调
	 * @param {String} event
	 * @return {Array}
	 */
	listeners(event) {
		this._callbacks = this._callbacks || {};
		return this._callbacks[event] || [];
	};

	/**
	 * 是否有指定事件
	 * @param {String} event
	 * @return {Boolean}
	 */
	hasListeners(event) {
		return !!this.listeners(event).length;
	};
}