import ngModule from '../module';
import getMainRoute from '../lib/get-main-route';

export default class Modules {
    constructor(aclService, $window, $translate) {
        Object.assign(this, {
            aclService,
            $window,
            $translate
        });
    }

    fetch() {
        const map = {};
        const modules = [];

        for (let mod of this.$window.routes) {
            if (!mod || !mod.routes) continue;

            let route = getMainRoute(mod.routes);
            if (!route || (route.acl && !this.aclService.hasAny(route.acl)))
                continue;

            let keyBind;
            if (mod.keybindings) {
                let res = mod.keybindings.find(i => i.state == route.state);
                if (res) keyBind = res.key.toUpperCase();
            }

            const module = {
                name: mod.name || mod.module,
                code: mod.module,
                icon: mod.icon || null,
                route,
                keyBind
            };

            modules.push(module);
            map[mod.module] = mod;
        }

        const sortedModules = modules.sort((a, b) => {
            const translatedNameA = this.$translate.instant(a.name);
            const translatedNameB = this.$translate.instant(b.name);
            return translatedNameA.localeCompare(translatedNameB);
        });
        this.modules = sortedModules;
        this.map = map;
    }

    reset() {
        this.modules = null;
        this.map = null;
    }

    get() {
        if (!this.modules) this.fetch();
        return this.modules;
    }

    getMap() {
        if (!this.map) this.fetch();
        return this.map;
    }
}
Modules.$inject = ['aclService', '$window', '$translate'];

ngModule.service('vnModules', Modules);