import { Type } from '@nestjs/common';
import { ModuleMetadata, Abstract, ForwardReference } from '@nestjs/common/interfaces';
export interface OdooInspiredModuleMetadata extends ModuleMetadata {
    name: string;
    version: string;
    description?: string;
    dependencies?: string[];
    isCore?: boolean;
    priority?: number;
    settings?: Record<string, any>;
}
export interface ModuleLifecycle {
    onModuleInit?(): Promise<void> | void;
    onModuleDestroy?(): Promise<void> | void;
    onApplicationBootstrap?(): Promise<void> | void;
    onApplicationShutdown?(signal?: string): Promise<void> | void;
}
export interface ModuleFactory<T> {
    create(options: T): DynamicOdooInspiredModule;
}
export interface DynamicOdooInspiredModule extends OdooInspiredModuleMetadata {
    module: Type<any>;
    global?: boolean;
}
export interface ModuleConfigOptions {
    name: string;
    version: string;
    enabled?: boolean;
    description?: string;
    dependencies?: string[];
    optionalDependencies?: string[];
    providers?: Array<Type<any> | Abstract<any> | ForwardReference | any>;
    exports?: Array<Type<any> | Abstract<any> | ForwardReference | string | any>;
    entities?: Type<any>[];
    controllers?: Type<any>[];
    lifecycle?: ModuleLifecycle;
    config?: Record<string, any>;
}
export interface ModuleContext {
    name: string;
    version: string;
    config: Record<string, any>;
    get<T>(token: Type<T> | string | symbol): T;
    logger: {
        log(message: any): void;
        error(message: any, trace?: string): void;
        warn(message: any): void;
        debug(message: any): void;
        verbose(message: any): void;
    };
    emit(eventName: string, payload: any): Promise<void>;
}
