/**
 * HuSNS 事件管理模块
 * 提供统一的事件绑定、解绑和生命周期管理
 * 防止事件监听器内存泄漏
 */
var HuSNS = window.HuSNS || {};
HuSNS.Event = {
    _listeners: {},
    _uidCounter: 0,
    _cleanupScheduled: false,
    
    /**
     * 绑定事件（防重复）
     * @param {HTMLElement} element - 目标元素
     * @param {string} eventName - 事件名称
     * @param {Function} handler - 事件处理函数
     * @param {string} namespace - 命名空间，用于批量解绑
     */
    on: function(element, eventName, handler, namespace) {
        if (!element || typeof element.addEventListener !== 'function') {
            console.warn('HuSNS.Event.on: 无效的元素', element);
            return;
        }
        
        if (!element._husns_uid) {
            element._husns_uid = ++this._uidCounter;
        }
        
        var key = this._getKey(element, eventName, namespace);
        
        // 防止重复绑定
        if (this._listeners[key]) {
            return;
        }
        
        var wrappedHandler = function(e) {
            handler.call(element, e);
        };
        
        element.addEventListener(eventName, wrappedHandler);
        
        this._listeners[key] = {
            element: element,
            eventName: eventName,
            handler: wrappedHandler,
            namespace: namespace,
            timestamp: Date.now()
        };
    },
    
    /**
     * 解绑事件
     * @param {HTMLElement} element - 目标元素
     * @param {string} eventName - 事件名称
     * @param {string} namespace - 命名空间
     */
    off: function(element, eventName, namespace) {
        if (!element) {
            return;
        }
        
        var key = this._getKey(element, eventName, namespace);
        var listener = this._listeners[key];
        
        if (listener) {
            try {
                listener.element.removeEventListener(listener.eventName, listener.handler);
            } catch (e) {
                console.warn('HuSNS.Event.off: 移除事件监听器失败', e);
            }
            delete this._listeners[key];
        }
    },
    
    /**
     * 解绑所有指定命名空间的事件
     * @param {string} namespace - 命名空间
     */
    offByNamespace: function(namespace) {
        var keysToRemove = [];
        for (var key in this._listeners) {
            if (this._listeners[key].namespace === namespace) {
                keysToRemove.push(key);
            }
        }
        for (var i = 0; i < keysToRemove.length; i++) {
            var key = keysToRemove[i];
            var listener = this._listeners[key];
            if (listener) {
                try {
                    listener.element.removeEventListener(listener.eventName, listener.handler);
                } catch (e) {}
                delete this._listeners[key];
            }
        }
    },
    
    /**
     * 解绑所有事件
     */
    offAll: function() {
        for (var key in this._listeners) {
            var listener = this._listeners[key];
            if (listener) {
                try {
                    listener.element.removeEventListener(listener.eventName, listener.handler);
                } catch (e) {}
            }
        }
        this._listeners = {};
    },
    
    /**
     * 触发自定义事件
     * @param {HTMLElement} element - 目标元素
     * @param {string} eventName - 事件名称
     * @param {*} detail - 事件数据
     */
    trigger: function(element, eventName, detail) {
        if (!element) {
            return;
        }
        
        var event = new CustomEvent(eventName, {
            detail: detail,
            bubbles: true,
            cancelable: true
        });
        
        element.dispatchEvent(event);
    },
    
    /**
     * 组件销毁时调用，自动清理所有相关事件
     * @param {HTMLElement} element - 组件根元素
     * @param {string} namespace - 命名空间
     */
    destroy: function(element, namespace) {
        if (!element) return;
        
        var keysToRemove = [];
        for (var key in this._listeners) {
            var listener = this._listeners[key];
            if (listener && listener.element === element) {
                if (!namespace || listener.namespace === namespace) {
                    keysToRemove.push(key);
                }
            }
        }
        
        for (var i = 0; i < keysToRemove.length; i++) {
            var key = keysToRemove[i];
            var listener = this._listeners[key];
            if (listener) {
                try {
                    listener.element.removeEventListener(listener.eventName, listener.handler);
                } catch (e) {}
                delete this._listeners[key];
            }
        }
    },
    
    /**
     * 获取当前注册的事件数量
     * @returns {number}
     */
    count: function() {
        return Object.keys(this._listeners).length;
    },
    
    /**
     * 获取Key
     * @private
     */
    _getKey: function(element, eventName, namespace) {
        return (namespace || '') + '-' + eventName + '-' + (element._husns_uid || 0);
    }
};

// 页面卸载时自动清理
window.addEventListener('beforeunload', function() {
    HuSNS.Event.offAll();
});

if (typeof module !== 'undefined' && module.exports) {
    module.exports = HuSNS.Event;
}