import { Container } from 'inversify';
import { BaseError, EngineEventType, FlowNodeInstance, FlowNodeInstanceResult, LogLevel, Logger, Model, ProcessInstanceState, ProcessModelFacade, RuntimeExpressionParameters, Subscription } from '@5minds/processcube_engine_sdk';
import { InternalIdentity as Identity, ProcessInstanceInternal as ProcessInstanceFromRepo, ProcessStartOptionsInternal } from '../Contracts/InternalDataModels/index';
import { EventMessageInternal, OnKillProcessCallback, OnProcessEndedCallback, OnProcessErrorCallback, OnProcessKilledCallback, OnProcessOwnerChangedCallback, OnProcessStartedCallback } from '../Contracts/InternalMessages/index';
import { CorrelationDatabaseAdapter, FlowNodeInstanceDatabaseAdapter, ProcessInstanceDatabaseAdapter } from '../Tools/DatabaseAdaptersSequelize';
import { EventMiddlewareHandler } from '../Tools/EventMiddlewareHandler';
import { IamService, IdentityService } from '../Tools/Iam/index';
import { ProcessDefinitionMediator } from '../Tools/ProcessDefinitionMediator';
import { DataObjectFacade } from './Facades/DataObjectFacade';
import { FlowNodeHandlerFactory } from './FlowNodeHandler/FlowNodeHandlerFactory';
import { ProcessTokenService } from './index';
export type ProcessInstanceFactory = (args: {
    parentProcessInstance?: ProcessInstance;
    processInstanceId?: string;
}) => ProcessInstance;
export type FlowNodeExpressionConfig = {
    expression: string;
    dataContract?: string;
    currentToken: object;
    allowNonObjectResults: boolean;
    previousFlowNode?: Model.Base.FlowNode;
    currentFlowNode?: Model.Base.FlowNode;
    dataObjectId?: string;
    additionalProperties?: {
        [key: string]: any;
    };
};
type FlowNodeInstanceResumingGroup = {
    nonActivityFlowNodeInstances: Array<FlowNodeInstance>;
    defaultActivityFlowNodeInstances: Array<FlowNodeInstance>;
    multiInstanceActivityFlowNodeInstances: {
        [activityExecutionId: string]: Array<FlowNodeInstance>;
    };
};
type FlowNodeExpressionBuilderConfig = Omit<FlowNodeExpressionConfig, 'expression'>;
export declare class ProcessInstance {
    protected readonly container: Container;
    protected readonly correlationDatabaseAdapter: CorrelationDatabaseAdapter;
    protected readonly dataObjectFacade: DataObjectFacade;
    protected readonly eventMiddlewareHandler: EventMiddlewareHandler;
    protected readonly flowNodeHandlerFactory: FlowNodeHandlerFactory;
    protected readonly flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter;
    protected readonly iamService: IamService;
    protected readonly identityService: IdentityService;
    protected readonly processInstanceDatabaseAdapter: ProcessInstanceDatabaseAdapter;
    protected readonly processDefinitionMediator: ProcessDefinitionMediator;
    protected readonly processTokenService: ProcessTokenService;
    protected processDefinitionId: string;
    protected processDefinitionHash: string;
    protected processModelId: string;
    protected processModelName: string;
    protected processModelVersion: string;
    protected correlationId: string;
    protected parentProcessInstance: ProcessInstance;
    protected processInstanceId: string;
    protected state: ProcessInstanceState;
    protected owner: Identity;
    protected initialTokenPayload: {};
    protected startedByRootAccessToken: boolean;
    protected embeddedProcessModelId?: string;
    protected correlationMetaData: {};
    protected processInstanceMetaData: {};
    protected processModelFacade: ProcessModelFacade;
    protected logger: Logger;
    private ownerChangedSubscription;
    private correlationMetadataChangedSubscription;
    private startedAt;
    private finishedAt;
    constructor(container: Container, correlationDatabaseAdapter: CorrelationDatabaseAdapter, dataObjectFacade: DataObjectFacade, eventMiddlewareHandler: EventMiddlewareHandler, flowNodeHandlerFactory: FlowNodeHandlerFactory, flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter, identityService: IdentityService, iamService: IamService, processDefinitionMediator: ProcessDefinitionMediator, processInstanceDatabaseAdapter: ProcessInstanceDatabaseAdapter, processTokenService: ProcessTokenService, parentProcessInstance?: ProcessInstance, processInstanceId?: string);
    getState(): ProcessInstanceState;
    getProcessInstanceId(): string;
    getCorrelationId(): string;
    getDataObjectFacade(): DataObjectFacade;
    getProcessDefinitionId(): string;
    getProcessDefinitionHash(): string;
    getProcessModelId(): string;
    getEmbeddedProcessModelId(): string;
    getProcessModelName(): string;
    getProcessModelVersion(): string;
    getParentProcessInstance(): ProcessInstance | undefined;
    getProcessModelFacade(): ProcessModelFacade;
    getProcessTokenService(): ProcessTokenService;
    getOwner(): Identity;
    getInitialPayload(): Record<string, any>;
    getCorrelationMetaData(): Record<string, string>;
    getProcessInstanceMetaData(): Record<string, string>;
    getStartedByRootAccessToken(): boolean;
    getStartedAt(): Date;
    getFinishedAt(): Date;
    getContainer(): Container;
    isEmbeddedSubprocess(): boolean;
    execute<TToken extends object>(identity: Identity, options: ProcessStartOptionsInternal<TToken>): Promise<EventMessageInternal>;
    resume(identity: Identity, processInstance: ProcessInstanceFromRepo, flowNodeInstances: Array<FlowNodeInstance>, parentDataObjectFacade?: DataObjectFacade, parentProcessModelFacade?: ProcessModelFacade): Promise<EventMessageInternal>;
    kill(killerIdentity: Identity): void;
    ensureOwnerHasClaim(claimName: string, claimValue?: string): void;
    setCorrelationMetadataValue(key: string, rawValue: string, flowNode: Model.Base.FlowNode, flowNodeInstanceId: string, currentToken?: object): Promise<string>;
    setProcessInstanceMetadataValue(key: string, rawValue: string, flowNode: Model.Base.FlowNode, flowNodeInstanceId: string, currentToken?: object): Promise<string>;
    executeRuntimeExpression<TExpectedResult>(config: FlowNodeExpressionConfig): Promise<TExpectedResult>;
    onProcessStarted(callback: OnProcessStartedCallback): Subscription;
    onProcessEnded(callback: OnProcessEndedCallback): Subscription;
    onProcessEndEventReached(endEventId: string, callback: OnProcessEndedCallback): Subscription;
    onTerminateEndEventReached(callback: OnProcessErrorCallback): Subscription;
    onProcessError(callback: OnProcessErrorCallback): Subscription;
    onKillProcess(callback: OnKillProcessCallback): Subscription;
    onProcessKilled(callback: OnProcessKilledCallback): Subscription;
    onOwnerChanged(callback: OnProcessOwnerChangedCallback): Subscription;
    buildRuntimeExpressionDataForFlowNodeInstance(config: FlowNodeExpressionBuilderConfig): RuntimeExpressionParameters;
    protected configure<TToken extends object>(identity: Identity, options: ProcessStartOptionsInternal<TToken>, processInstanceData?: ProcessInstanceFromRepo): Promise<void>;
    protected save(options: ProcessStartOptionsInternal<object>): Promise<void>;
    protected executeProcess<TToken extends object>(options: ProcessStartOptionsInternal<TToken>): Promise<FlowNodeInstanceResult>;
    protected resumeProcess(flowNodeInstances: Array<FlowNodeInstance>, flowNodeInstancesToResume?: Array<FlowNodeInstance>): Promise<FlowNodeInstanceResult>;
    protected resumeProcessFromStart(allFlowNodeInstances: Array<FlowNodeInstance>): Promise<void>;
    protected resumeProcessAtExitPoints(allFlowNodeInstances: Array<FlowNodeInstance>, flowNodeInstancesToResume: Array<FlowNodeInstance>): Promise<void>;
    protected buildResumptionPromises(allFlowNodeInstances: Array<FlowNodeInstance>, flowNodeInstancesToResume: Array<FlowNodeInstance>): Promise<void>;
    protected finish(): Promise<FlowNodeInstanceResult>;
    protected finishWithError(error: BaseError): Promise<void>;
    protected cleanup(): Promise<void>;
    protected terminateSubprocesses(): Promise<void>;
    protected changeOwner(newOwner: Identity, eventId: string): void;
    protected updateCorrelationMetadata(newMetadata: Record<string, any>): void;
    protected sendProcessStartingNotification(): void;
    protected sendProcessResumedNotification(): void;
    protected sendProcessOwnerChangedNotification(): void;
    protected sendFinishedNotification(resultToken: FlowNodeInstanceResult, finalFlowNode: Model.Base.FlowNode): void;
    protected sendErrorNotification(error: BaseError): void;
    protected sendTerminationNotification(error: BaseError): void;
    protected logProcessStarting<TPayload extends object>(payload?: TPayload): void;
    protected logProcessStarted<TPayload extends object>(payload?: TPayload): void;
    protected logProcessResumed<TPayload extends object>(payload?: TPayload): void;
    protected logProcessFinished<TPayload extends object>(payload?: TPayload): void;
    protected logProcessError(error: Error): void;
    protected logProcessTerminated<TPayload extends object>(payload?: TPayload): void;
    protected writeLog<TPayload extends object>(event: EngineEventType, logLevel: LogLevel, payload?: TPayload): void;
    private checkForFlowNodeInstancesWithMultipleSuccessors;
    protected getFlowNodeInstancesToResume(allFlowNodeInstances: Array<FlowNodeInstance>): Array<FlowNodeInstance>;
    private retrieveCorrelationMetadata;
    private getNotificationPayload;
    private getEventType;
    protected groupFlowNodeInstancesByResumingStrategy(flowNodeInstancesToResume: Array<FlowNodeInstance>): FlowNodeInstanceResumingGroup;
    private isActivity;
    private seedDataObjectsWithIntialValues;
}
export {};
