import webpack, { Stats } from 'webpack';

type ReporterContextFunc<T = any> = (context: WebpackBarProgressPlugin, opts: T) => void;
interface State {
    start: [number, number] | null;
    progress: number;
    done: boolean;
    message: string;
    details: string[];
    request: null | {
        file: null | string;
        loaders: string[];
    };
    hasErrors: boolean;
    color: string;
    name: string;
}
interface Reporter {
    /**
     * Called when (re)compile is started
     */
    start?: ReporterContextFunc;
    /**
     * Called when a file changed on watch mode
     */
    change?: ReporterContextFunc<{
        shortPath: string;
    }>;
    /**
     * Called after each progress update
     */
    update?: ReporterContextFunc;
    /**
     * Called when compile finished
     */
    done?: ReporterContextFunc<{
        stats: Stats;
    }>;
    /**
     * Called when build progress updated
     */
    progress?: ReporterContextFunc;
    /**
     * Called when _all_ compiles finished
     */
    allDone?: ReporterContextFunc;
    beforeAllDone?: ReporterContextFunc;
    afterAllDone?: ReporterContextFunc;
}
type ReporterOpts = {
    reporter: Reporter | string;
    options?: any;
};
type ReporterInput = string | [Reporter | string, any?] | ReporterOpts;
interface WebpackBarOptions {
    /**
     * Display name
     * @default 'webpack'
     */
    name?: string;
    /**
     * Color output of the progress bar
     * @default 'green'
     */
    color?: string;
    /**
     * Enable profiler
     * @default false
     */
    profile?: boolean;
    /**
     * Enable bars reporter
     * Defaults to 'true' when not in CI or testing mod
     * @default true
     */
    fancy?: boolean;
    /**
     * Enable a simple log reporter (only start and end)
     * Defaults to 'true' when running in minimal environments
     * @default true
     */
    basic?: boolean;
    /**
     * Register a custom reporter
     */
    reporter?: ReporterInput;
    /**
     * Register an Array of your custom reporters.
     * @default ['basic'] | ['fancy']
     */
    reporters?: ReporterInput[];
}

declare class WebpackBar {
    private options;
    private reporters;
    constructor(options?: WebpackBarOptions);
    callReporters(fn: any, payload?: {}): void;
    get hasRunning(): boolean;
    get hasErrors(): boolean;
    get statesArray(): any[];
    get states(): {
        [key: string]: State;
    };
    get state(): State;
    _ensureState(): void;
    apply(compiler: any): void;
    updateProgress(percent?: number, message?: string, details?: any[]): void;
}

declare class WebpackBarProgressPlugin extends webpack.ProgressPlugin {
    webpackbar: WebpackBar;
    constructor(options?: WebpackBarOptions);
    apply(compiler: any): void;
}

export { type Reporter as R, type State as S, WebpackBar as W, type WebpackBarOptions as a, WebpackBarProgressPlugin as b };
