import { FinancialInstitutionAccount } from "../FinancialInstitutionAccount";
import { MessageSetType } from "../../domain/data/MessageSetType";
import { FinancialInstitutionImpl } from "./FinancialInstitutionImpl";
import { AccountStatement } from "../AccountStatement";
import { StatementRange } from "../../domain/data/common/StatementRange";
import { TransactionWrappedRequestMessage } from "../../domain/data/TransactionWrappedRequestMessage";
import { RequestMessage } from "../../domain/data/RequestMessage";
import { ResponseEnvelope } from "../../domain/data/ResponseEnvelope";
import { StatementResponse } from "../../domain/data/common/StatementResponse";
import { RequestMessageSet } from "../../domain/data/RequestMessageSet";
import { StatementRequest } from "../../domain/data/common/StatementRequest";
/**
 * Base account implementation. Supports banking and credit card accounts.
 */
export declare abstract class BaseAccountImpl<D> implements FinancialInstitutionAccount {
    private details;
    private messageType;
    private username;
    private password;
    private institution;
    constructor(details: D, username: string, password: string, institution: FinancialInstitutionImpl);
    /**
     * Get the message set type of the specified details.
     *
     * @param details The details.
     * @return The message set type.
     */
    protected getMessageSetType(details: D): MessageSetType;
    readStatement(start: Date, end: Date): Promise<AccountStatement>;
    /**
     * Unwrap the statement response from the specified response envelope.
     *
     * @param response The response envelope to unwrap.
     * @return The response.
     */
    protected abstract unwrapStatementResponse(response: ResponseEnvelope): StatementResponse;
    /**
     * Create a request message set from the specified transaction.
     *
     * @param transaction The transaction.
     * @return The request message set.
     */
    protected abstract createRequestMessageSet(transaction: TransactionWrappedRequestMessage<RequestMessage>): RequestMessageSet;
    /**
     * Create a transaction.
     *
     * @return The transaction.
     */
    protected abstract createTransaction(): TransactionWrappedRequestMessage<RequestMessage>;
    /**
     * Create a statement request.
     *
     * @param details The details.
     * @param range the range.
     * @return The statement request.
     */
    protected abstract createStatementRequest(details: D, range: StatementRange): StatementRequest;
    /**
     * The details of this account.
     *
     * @return The details of this account.
     */
    getDetails(): D;
    /**
     * The message set type.
     *
     * @return The message set type.
     */
    protected getMessageType(): MessageSetType;
}
