

export default class EventRegister {

    static _Single;

    static Get() {
        if (this._Single == null || this._Single == undefined) {
            this._Single = new EventRegister();
        }

        return this._Single;
    }

    constructor() {

        this.Events = [
            //Изменение состояния авторизации пользователя
            "OnAuthChange",

            //Изменение ID активной папки в основном окне
            "OnItemsChange_Main",
            //Информация об активной папке в основном окне была загружена
            "OnItemsChange_MainExplorer_InfoLoaded",

            //Изменение ID активной папки в окне перемещения
            "OnItemsChange_Move",
             //Информация об активной папке в окне перемещения была загружена (Не реализовано)
            "OnItemsChange_MoveExplorer_InfoLoaded",

            //Изменение данных на странице администрирования
            "OnHaveDataChange"
        ];
        this.Listeners = {};

        this.Events.map(function (event) {
            this.Listeners[event] = [];
        }.bind(this));
    }


    RegisterListener(Event, control) {
        if (!this.Events.includes(Event))
            throw "Event not found";

        if (control["Event_" + Event] == undefined)
            throw "Control not implement event function";

        this.Listeners[Event].push(control);

        //Флаг используется в BaseControl, 
        //чтобы при уничтожении контрола 
        //инициировать удаление из EventRegister listeners
        control.IsEventListener = true;
    }

    UnregistListener(control) {

        Object
            .keys(this.Listeners)
            .map(
                function (e) {
                    let pos = this.Listeners[e].findIndex(e2 => e2.ID === control.ID);
                    if (pos != -1) {
                        this.Listeners[e].splice(pos, 1);
                    }
                }
                    .bind(this)
            );
    }

    EventAction(Event, params) {

        if (!this.Events.includes(Event)) {
            throw "Event not found";
        }

        this
            .Listeners[Event]
            .map(
                function (e) {
                    e["Event_" + Event](params);
                }
            );
    }

}