import * as _angular_core from '@angular/core';
import { OnDestroy } from '@angular/core';
import * as rxjs from 'rxjs';
import { Observable } from 'rxjs';

declare enum CommandEventType {
    START = "start",
    SUCCESS = "success",
    FAIL = "fail",
    RESTART = "restart",
    DEAD = "dead"
}
interface CommandEvent {
    type: CommandEventType;
    timestamp: Date;
    command: Command;
    data?: any;
}
type CommandEventSignal = CommandEvent;

interface Command {
    id: string;
    execute(): Observable<any>;
    events?: CommandEvent[];
}

interface CommanderConfiguration {
    error: {
        maxNumberOfRetries: number;
    };
}
declare enum CommanderState$1 {
    IDLE = 0,
    EXECUTING = 1,
    DONE = 2,
    ERROR = 3
}
declare enum CommandsType$1 {
    WAITING = 0,
    DONE = 1,
    ERROR = 2,
    DEAD = 3
}
type CommandsSignal = Command[];
type CommanderStateSignal = CommanderState$1;

declare enum CommanderState {
    IDLE = 0,
    EXECUTING = 1,
    DONE = 2,
    ERROR = 3
}
declare enum CommandsType {
    WAITING = 0,
    DONE = 1,
    ERROR = 2,
    DEAD = 3
}
declare class Commander implements OnDestroy {
    private configuration;
    private commandsSubject;
    private commandsDoneSubject;
    private commandsInErrorSubject;
    private commandsDeadSubject;
    private stateSubject;
    private processingCommand;
    private destroy$;
    commands$: rxjs.Observable<Command[]>;
    commandsDone$: rxjs.Observable<Command[]>;
    commandsInError$: rxjs.Observable<Command[]>;
    commandsDead$: rxjs.Observable<Command[]>;
    state$: rxjs.Observable<CommanderState>;
    commandsSignal: _angular_core.Signal<Command[]>;
    commandsDoneSignal: _angular_core.Signal<Command[]>;
    commandsInErrorSignal: _angular_core.Signal<Command[]>;
    commandsDeadSignal: _angular_core.Signal<Command[]>;
    stateSignal: _angular_core.Signal<CommanderState>;
    constructor();
    ngOnDestroy(): void;
    init(configuration: CommanderConfiguration): void;
    private startCommander;
    private handleSuccessfulCommand;
    private handleFailedCommand;
    stop(): void;
    addCommand(command: Command): void;
    replayCommandsInError(): void;
    private trashDeadCommands;
    flushDeadCommands(): void;
    getCommands(type: CommandsType): Command[];
    getState(): CommanderState;
    private executeNextCommand;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<Commander, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<Commander>;
}

export { CommandEventType, Commander, CommanderState$1 as CommanderState, CommandsType$1 as CommandsType };
export type { Command, CommandEvent, CommandEventSignal, CommanderConfiguration, CommanderStateSignal, CommandsSignal };
