import { Type } from '@nestjs/common';
import { ModuleContext } from './module.interfaces';
export interface PluginMetadata {
    name: string;
    version: string;
    description?: string;
    author?: string;
    dependencies?: string[];
    targetModules?: string[];
    priority?: number;
    tags?: string[];
}
export interface PluginLifecycle {
    onLoad?(context: ModuleContext): Promise<void> | void;
    onEnable?(context: ModuleContext): Promise<void> | void;
    onDisable?(context: ModuleContext): Promise<void> | void;
    onBootstrap?(context: ModuleContext): Promise<void> | void;
    onShutdown?(context: ModuleContext): Promise<void> | void;
}
export interface HookPoint {
    name: string;
    description?: string;
    module: string;
    priority?: number;
}
export interface HookHandler<T = any, R = any> {
    (data: T, context: ModuleContext): Promise<R> | R;
}
export interface HookResult<R = any> {
    result?: R;
    break?: boolean;
}
export interface PluginRegistrationOptions {
    metadata: PluginMetadata;
    lifecycle?: PluginLifecycle;
    hooks?: Record<string, HookHandler>;
    providers?: Type<any>[];
    config?: Record<string, any>;
}
export interface PluginManager {
    register(plugin: PluginRegistrationOptions): Promise<void>;
    enable(pluginName: string): Promise<boolean>;
    disable(pluginName: string): Promise<boolean>;
    getPlugins(): PluginMetadata[];
    getPlugin(name: string): PluginMetadata | undefined;
    isEnabled(name: string): boolean;
    registerHook(hookName: string, handler: HookHandler): void;
    executeHook<T = any, R = any>(hookName: string, data: T): Promise<R[]>;
}
