import { Log } from '../util/logger.js';
import { Certificate, CertificateHelper } from '../certificate.js';
import { CronStampConfig, FullCronStampConfig } from '../util/config.js';
import { BlockchainName } from '../blockchains/blockchains.js';
export declare enum Step {
    INIT = 0,// load input data
    HASH_INPUT_DATA = 1,// hash data
    REQUEST_CALCULATE_SALT = 2,// calculate salted hash
    REQUEST_SUBMIT_DOCUMENT_HASH = 3,// submitted to api
    REQUEST_RECEIVE_PRECERT = 4,// precert received (this also contains a url to this precert as additional data)
    REQUEST_CREATE_CERTIFICATE_FOR_SINGLE_BLOCKCHAIN = 5,// after the root hash for a specific blockchain is successfully inserted into the blockchain and verified
    REQUEST_FULL_CERTIFICATE_SUCCEEDED = 6,// this only has type success and means a full certificate is available
    VERIFICATION_CHECK_CERTIFICATE_SYNTAX = 7,// check that required fields exists
    VERIFICATION_COMPARE_SALTED_HASHES = 8,// hash data and compare to certificate
    VERIFICATION_VERIFY_SINGLE_BLOCKCHAIN = 9,// verify individual blockchains. A success state means this blockchain is full verified.
    VERIFICATION_ALL_BLOCKCHAINS_SUCCEEDED = 10
}
export declare enum MessageType {
    SUCCESS = 0,// step is successful
    ERROR = 1,// this is passed to the error handler, if provided and to the message handler otherwise
    PROGRESS = 2
}
export declare enum AdditionalDataType {
    NONE = 0,
    PRECERT_URL = 1,// Url to cloud hosted precert (only valid a limited time)
    HTTP_RESPONSE_JSON = 2,// Json of http response for example when an error is returned by the api
    ERROR = 3,// error detail
    HASH = 4,// used for merkle tree root hash
    TIMESTAMP = 5,// time in blockchain, if there is a mismatch with certificate time
    PARSED_CERTIFICATE = 6,// successfully parsed certificate from file or string
    INVALID_SYNTAX_CERTIFICATE = 7,// used, when certificate is determined to have invalid syntax
    PROCESSED_BLOCKCHAIN = 8
}
export declare enum InputDataType {
    STRING = 0,
    FILE = 1,
    HASH = 2
}
export type InputData = {
    type: InputDataType;
    data: string | File;
    blockchainsToRequire?: BlockchainName[];
};
export type ErrorInfo = {
    rawError: Error;
    additionalDataType: AdditionalDataType;
    additionalData: any;
    type: ErrorTypes;
};
export declare enum ErrorTypes {
    DOCUMENT_ALTERED = 0,
    TEMPORARY = 1,
    UNEXPECTED = 2
}
export type ResultData = {
    step: Step;
    type: MessageType;
    blockchain: BlockchainName | undefined;
    currentCert: Certificate;
    message: string;
    additionalDataType: AdditionalDataType;
    additionalData: any;
    inputData: InputData & {
        certFileName: string;
        displayName: string;
    };
    currentTime: Date;
};
export declare abstract class CertificateProcess {
    config: FullCronStampConfig;
    protected inputData: InputData;
    protected certHelper: CertificateHelper;
    protected messageHandler: (data: ResultData) => boolean | void;
    protected errorHandler: (data: ResultData) => void;
    protected step: Step;
    protected currentBlockchain: BlockchainName | undefined;
    private started;
    protected cancelled: boolean;
    protected log: Log;
    protected constructor(data: InputData, moduleName: string);
    onMessage(handler: (data: ResultData) => boolean | void): this;
    onError(handler: (data: ResultData) => void): this;
    cancel(): void;
    configure(newConfig: CronStampConfig): this;
    /**
     * start process by handling input data
     * @returns last result data containing a success or error message
     */
    start(): Promise<ResultData>;
    sendError(message: string, additionalDataType?: AdditionalDataType, additionalData?: any): ResultData;
    sendMessage(message: string, type: MessageType, additionalDataType?: AdditionalDataType, additionalData?: any): ResultData;
    protected handleException(exception: Error): ResultData;
    protected getIdentifier(): string;
    protected getShortName(): string;
    protected getInputDataName(): string;
}
export declare class ProcessError extends Error {
    additionalData: any;
    errorInfo: ErrorInfo;
    constructor(message: string, type: ErrorTypes, additionalDataType?: AdditionalDataType, additionalData?: any);
}
//# sourceMappingURL=manager.d.ts.map