import * as Debug from "debug";
import { ErrorChain } from "../lib/error";
import { Container } from "./container";
import { Environment } from "./environment";
import { ELogLevel, ILogMessage, ILogMetadata, Log } from "./log";
import { EMetricType, IMetricTags, Metric } from "./metric";
/** Container options injected by awilix library. */
export interface IModuleOptions {
    moduleName: string;
    opts: any;
}
/** Module dependencies. */
export interface IModuleDependencies {
    [key: string]: typeof Module;
}
/** Module up/down hooks. */
export declare type IModuleUp = () => Promise<void>;
export declare type IModuleDown = () => Promise<void>;
export declare type IModuleHook = IModuleUp | IModuleDown;
/** Module destroy hook. */
export declare type IModuleDestroy = () => void;
/** Module error codes. */
export declare enum EModuleError {
    Dependency = "ModuleError.Dependency"
}
/** Module error class. */
export declare class ModuleError extends ErrorChain {
    constructor(code: EModuleError, cause?: Error, context?: object);
}
/** Container module log class. */
export declare class ModuleLog extends Log {
    protected readonly container: Container;
    protected readonly namespace: string;
    constructor(container: Container, namespace: string);
    /**
     * Sends log message to container bus for consumption by modules.
     * Adds module namespace to metadata object by default.
     */
    protected log(level: ELogLevel, message: ILogMessage, metadata: ILogMetadata, ...args: any[]): void;
}
/** Container module metric class. */
export declare class ModuleMetric extends Metric {
    protected readonly container: Container;
    protected readonly namespace: string;
    constructor(container: Container, namespace: string);
    /**
     * Sends metric message to container bus for consumption by modules.
     * Adds module namespace to tags object by default.
     */
    protected metric(type: EMetricType, name: string, value: any, tags: IMetricTags, ...args: any[]): void;
}
/** Base class for container class modules with dependency injection. */
export declare class Module {
    /** Default module name. */
    static readonly moduleName: string;
    /** Module name. */
    readonly moduleName: string;
    /** Module container reference. */
    readonly container: Container;
    /** Module log interface. */
    readonly log: ModuleLog;
    /** Module metric interface. */
    readonly metric: ModuleMetric;
    /** Module debug interface. */
    readonly debug: Debug.IDebugger;
    /** Module container environment reference. */
    get environment(): Environment;
    /** Module container and module names. */
    get namespace(): string;
    constructor(options: IModuleOptions);
    /** Module dependencies hook. */
    moduleDependencies(...args: IModuleDependencies[]): IModuleDependencies;
    /** Module operational state hook. */
    moduleUp(...args: IModuleUp[]): Promise<void>;
    /** Module non-operational state hook. */
    moduleDown(...args: IModuleDown[]): Promise<void>;
    /** Module destruction hook. */
    moduleDestroy(...args: IModuleDestroy[]): void;
}
