import { EntityType, KeyMapping, MetadataStore, SaveOptions } from "breeze-client";
import { BaseError, Transaction } from "sequelize";
import { SaveMap } from "./SaveMap";
import { KeyGenerator, SequelizeManager } from "./SequelizeManager";
export interface OpenObj {
    [k: string]: any;
}
export declare type ServerEntityState = "Added" | "Deleted" | "Modified";
/** Save bundle from breeze client */
export interface SaveRequest {
    body: {
        entities: ServerEntity[];
        saveOptions?: SaveOptions;
    };
}
/** Server-side representation of entity that came from the client */
export interface ServerEntityInfo {
    entity: ServerEntity;
    entityType: EntityType;
    wasAddedOnServer?: boolean;
    forceUpdate?: boolean;
    unmapped?: any;
    entityAspect: ServerEntityAspect;
}
export interface ServerEntity {
    [k: string]: any;
    entityAspect: ServerEntityAspect;
}
export interface ServerEntityAspect {
    entityTypeName: string;
    defaultResourceName: string;
    entityState: ServerEntityState;
    entity?: ServerEntity;
    autoGeneratedKey?: {
        autoGeneratedKeyType: string;
        propertyName?: string;
    };
    originalValuesMap?: {
        [prop: string]: any;
    };
}
export declare type ServerSaveResult = ServerGoodSaveResult | ServerBadSaveResult;
export interface ServerGoodSaveResult {
    entities: OpenObj[];
    keyMappings: KeyMapping[];
}
export interface ServerBadSaveResult {
    errors: any[];
    message: string;
    [k: string]: any;
}
export declare class ServerSaveError extends Error {
    entityErrors: ServerEntityError[];
    constructor(m: string, entityErrors?: ServerEntityError[]);
}
export declare class SequelizeSaveError extends Error {
    entity: OpenObj;
    entityState: ServerEntityState;
    constructor(e: BaseError, entity: OpenObj, entityState?: ServerEntityState);
}
/** Validation error created on the server */
export interface ServerEntityError {
    entityTypeName: string;
    errorName: string;
    errorMessage: string;
    propertyName: string;
    keyValues: any[];
}
export declare type BeforeSaveEntityFn = (e: ServerEntityInfo) => boolean;
export declare type BeforeSaveEntitiesFn = (sm: SaveMap, trx?: Transaction) => Promise<SaveMap>;
/** Handles saving entities from Breeze SaveChanges requests */
export declare class SequelizeSaveHandler {
    readonly sequelizeManager: SequelizeManager;
    readonly metadataStore: MetadataStore;
    readonly entitiesFromClient: ServerEntity[];
    saveOptions: SaveOptions;
    private _keyMappings;
    private _fkFixupMap;
    private _savedEntities;
    /** Generates keys for entity types where autoGeneratedKeyType = "KeyGenerator" */
    keyGenerator: KeyGenerator;
    /** Process an entity before save. If false is returned, entity is not saved. */
    beforeSaveEntity: BeforeSaveEntityFn;
    /** Process all entities before save.  The entities in the returned SaveMap are saved. */
    beforeSaveEntities: BeforeSaveEntitiesFn;
    /** Create an instance for the given save request */
    constructor(sequelizeManager: SequelizeManager, req: SaveRequest);
    /** Save the entities in the save request, returning either the saved entities or an error collection */
    save(): Promise<ServerSaveResult>;
    private _saveWithTransaction;
    private _saveCore;
    private _processEntityGroup;
    private _saveEntityAsync;
    private _addToResults;
    private _coerceData;
}
