export type IEventLisParameters = Parameters<typeof addEventListener>;
export type IEventLisReturn = ReturnType<typeof addEventListener>;

type IType = IEventLisParameters[0];
type Ilistener = IEventLisParameters[1];
type Ioptions = IEventLisParameters[2];

export class ProxyEventListener {
    eventLis = new Map<IType, Map<Ilistener, Ioptions>>();

    // 添加事件
    addEventListener (type: IType, listener: Ilistener, options: Ioptions) {
        if(!this.eventLis.has(type)) {
            this.eventLis.set(type, new Map());
        }
        const listeners = this.eventLis.get(type);
        listeners?.set(listener, options);
        return window.addEventListener(type, listener, options);
    }

    // 删除事件
    removeEventListener (type: IType, listener: Ilistener, options: Ioptions) {
        if(!this.eventLis.has(type)) {
            this.eventLis.set(type, new Map());
        }
        const listeners = this.eventLis.get(type);
        if(listeners?.get(listener) === options) {
            listeners?.delete(listener);
        }
        return window.removeEventListener(type, listener, options);
    }

    // 全部清除事件
    clear () {
        Array.from(this.eventLis.keys()).forEach(key => {
            const listeners = this.eventLis.get(key);
            if(listeners instanceof Map) {
                Array.from(listeners.keys()).forEach(listener => {
                    window.removeEventListener(key, listener, listeners.get(listener));
                });
            }
        });
    }
}