/// <reference types="node" />

import EventEmitter from 'events';
import { Plugin as Plugin_2 } from 'rollup';

declare class FeRegistry<CFG extends object = object> extends EventEmitter {
    normalizeModuleData(data: Partial<TModuleData<CFG>>): TModuleData<CFG>;
    registerModule(data: Partial<TModuleData<CFG>>): {
        files: string[];
        id: string;
        version: string;
        entry: string;
        source: string;
        config: TFeRoomConfig<CFG>;
        activate?: boolean | undefined;
    };
    registerFromNpm(npmData: TNpmModuleData<CFG>): Promise<"Module alread exists" | {
        files: string[];
        id: string;
        version: string;
        entry: string;
        source: string;
        config: TFeRoomConfig<CFG>;
        activate?: boolean | undefined;
    }>;
    readModule(id: string, version?: string): TModuleData<CFG>;
    exists(id: string, version?: string): boolean;
    getActiveVersion(id: string): string;
    getModulesList(): string[];
    getAllModules(): TModuleData<CFG>[];
}

export declare class SharedMenuController {
    protected _registry: FeRegistry;
    constructor(_registry: FeRegistry);
    getModuleMenu(module: TModuleData<TSharedMenuCfg>): TSharedMenu;
    menu(): string;
}

declare interface TFeRoomConfig<EXT extends object = TFeRoomExtionsOptionsAll> {
    registerOptions?: TFeRoomRegisterOptions;
    buildOptions?: TFeRoomRollupOptions;
    extensions?: EXT;
}

declare interface TFeRoomExtionsOptionsAll {
    sharedMenu?: object;
    vueRoutes?: object[];
}

declare interface TFeRoomRegisterOptions {
    id?: string;
    entry?: string;
    label?: string;
    description?: string;
    include?: string[];
    exclude?: string[];
    preloadEntry?: boolean | 'head' | 'body:first' | 'body:last';
    preloadScripts?: string | string[];
    preloadCss?: string | string[];
    appendHead?: string;
    appendBody?: string;
    globals?: object;
    lockDependency?: {
        [name: string]: string;
    };
    importNpmDependencies?: {
        [name: string]: TNpmModuleData;
    };
}

declare interface TFeRoomRollupOptions {
    input?: string;
    ts?: boolean | object;
    vue?: boolean | object;
    css?: string | object;
    nodeResolve?: object;
    dependencies?: {
        bundle?: string[];
        lockVersion?: string[];
    };
    feroomConfPath?: string;
    output?: string;
    plugins?: Plugin_2[];
}

export declare interface TMenuItem {
    icon?: string;
    route?: string;
    children?: Record<string, TMenuItem>;
    description?: string;
    params?: Record<string, string>;
}

declare interface TModuleData<EXT extends object = object> {
    id: string;
    version: string;
    files: Record<string, string | {
        type: 'Buffer';
        data: number[];
    }>;
    entry: string;
    source: string;
    config: TFeRoomConfig<EXT>;
    activate?: boolean;
}

declare type TNpmModuleData<EXT extends object = object> = {
    registry?: string;
    name: string;
    version?: string;
    rebuildIfExists?: boolean;
} & Partial<TModuleData<EXT>>;

export declare type TSharedMenu = Record<string, TMenuItem>;

export declare interface TSharedMenuCfg {
    sharedMenu?: TSharedMenu;
}

export { }

// FeRoom dynamic module "@feroom-dynamic/shared-menu"
declare module '@feroom-dynamic/shared-menu' {
    export interface TMenuItem {
        icon?: string
        route?: string
        children?: Record<string, TMenuItem>
        description?: string
        params?: Record<string, string>
    }
    
    export type TSharedMenu = Record<string, TMenuItem>
        
    export const sharedMenu: TSharedMenu
    export default sharedMenu
}
