import { Schema, SchemaDefinition, IndexItem } from "../Schema";
import { Document as DocumentCarrier, DocumentSaveSettings } from "../Document";
import { Serializer, SerializerOptions } from "../Serializer";
import { Condition, ConditionInitalizer } from "../Condition";
import { Scan, Query } from "../DocumentRetriever";
import { CallbackType, ObjectType, FunctionType, DocumentArray, ModelType } from "../General";
import { DynamoDB, AWSError } from "aws-sdk";
interface ModelWaitForActiveSettings {
    enabled: boolean;
    check: {
        timeout: number;
        frequency: number;
    };
}
export interface ModelExpiresSettings {
    ttl: number;
    attribute: string;
    items?: {
        returnExpired: boolean;
    };
}
declare enum ModelUpdateOptions {
    ttl = "ttl",
    indexes = "indexes",
    throughput = "throughput"
}
export interface ModelOptions {
    create: boolean;
    throughput: "ON_DEMAND" | number | {
        read: number;
        write: number;
    };
    prefix: string;
    suffix: string;
    waitForActive: ModelWaitForActiveSettings;
    update: boolean | ModelUpdateOptions[];
    populate: string | string[] | boolean;
    expires?: number | ModelExpiresSettings;
}
export declare type ModelOptionsOptional = Partial<ModelOptions>;
declare type KeyObject = {
    [attribute: string]: string;
};
declare type InputKey = string | KeyObject;
interface ModelGetSettings {
    return: "document" | "request";
    attributes?: string[];
}
interface ModelDeleteSettings {
    return: null | "request";
}
interface ModelBatchPutSettings {
    return: "response" | "request";
}
interface ModelUpdateSettings {
    return: "document" | "request";
    condition?: Condition;
}
interface ModelBatchGetDocumentsResponse<T> extends DocumentArray<T> {
    unprocessedKeys: ObjectType[];
}
interface ModelBatchGetSettings {
    return: "documents" | "request";
}
interface ModelBatchDeleteSettings {
    return: "response" | "request";
}
export declare class Model<T extends DocumentCarrier> {
    constructor(name: string, schema: Schema | SchemaDefinition | (Schema | SchemaDefinition)[], options: ModelOptionsOptional);
    name: string;
    options: ModelOptions;
    schemas: Schema[];
    serializer: Serializer;
    private ready;
    alreadyCreated: boolean;
    private pendingTasks;
    latestTableDetails: DynamoDB.DescribeTableOutput;
    pendingTaskPromise: () => Promise<void>;
    static defaults: ModelOptions;
    Document: typeof DocumentCarrier;
    scan: (this: Model<DocumentCarrier>, object?: ConditionInitalizer) => Scan;
    query: (this: Model<DocumentCarrier>, object?: ConditionInitalizer) => Query;
    methods: {
        document: {
            set: (name: string, fn: FunctionType) => void;
            delete: (name: string) => void;
        };
        set: (name: string, fn: FunctionType) => void;
        delete: (name: string) => void;
    };
    schemaForObject(object: ObjectType): Promise<Schema>;
    getIndexes(): Promise<{
        GlobalSecondaryIndexes?: IndexItem[];
        LocalSecondaryIndexes?: IndexItem[];
    }>;
    getCreateTableAttributeParams(): Promise<Pick<DynamoDB.CreateTableInput, "AttributeDefinitions" | "KeySchema" | "GlobalSecondaryIndexes" | "LocalSecondaryIndexes">>;
    getHashKey(): string;
    getRangeKey(): string | void;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[]): Promise<ModelBatchGetDocumentsResponse<DocumentCarrier>>;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[], callback: CallbackType<ModelBatchGetDocumentsResponse<DocumentCarrier>, AWSError>): void;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchGetSettings & {
        "return": "documents";
    }): Promise<ModelBatchGetDocumentsResponse<DocumentCarrier>>;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchGetSettings & {
        "return": "documents";
    }, callback: CallbackType<ModelBatchGetDocumentsResponse<DocumentCarrier>, AWSError>): void;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchGetSettings & {
        "return": "request";
    }): DynamoDB.BatchGetItemInput;
    batchGet(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchGetSettings & {
        "return": "request";
    }, callback: CallbackType<DynamoDB.BatchGetItemInput, AWSError>): void;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[]): Promise<{
        "unprocessedItems": ObjectType[];
    }>;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[], callback: CallbackType<{
        "unprocessedItems": ObjectType[];
    }, AWSError>): void;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[], settings: ModelBatchPutSettings & {
        "return": "request";
    }): Promise<DynamoDB.BatchWriteItemInput>;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[], settings: ModelBatchPutSettings & {
        "return": "request";
    }, callback: CallbackType<DynamoDB.BatchWriteItemInput, AWSError>): void;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[], settings: ModelBatchPutSettings & {
        "return": "response";
    }): Promise<{
        "unprocessedItems": ObjectType[];
    }>;
    batchPut(this: Model<DocumentCarrier>, documents: ObjectType[], settings: ModelBatchPutSettings & {
        "return": "response";
    }, callback: CallbackType<{
        "unprocessedItems": ObjectType[];
    }, AWSError>): void;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[]): Promise<{
        unprocessedItems: ObjectType[];
    }>;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[], callback: CallbackType<{
        unprocessedItems: ObjectType[];
    }, AWSError>): void;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchDeleteSettings & {
        "return": "response";
    }): Promise<{
        unprocessedItems: ObjectType[];
    }>;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchDeleteSettings & {
        "return": "response";
    }, callback: CallbackType<{
        unprocessedItems: ObjectType[];
    }, AWSError>): Promise<{
        unprocessedItems: ObjectType[];
    }>;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchDeleteSettings & {
        "return": "request";
    }): DynamoDB.BatchWriteItemInput;
    batchDelete(this: Model<DocumentCarrier>, keys: InputKey[], settings: ModelBatchDeleteSettings & {
        "return": "request";
    }, callback: CallbackType<DynamoDB.BatchWriteItemInput, AWSError>): void;
    update(this: Model<DocumentCarrier>, obj: ObjectType): Promise<DocumentCarrier>;
    update(this: Model<DocumentCarrier>, obj: ObjectType, callback: CallbackType<DocumentCarrier, AWSError>): void;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType): Promise<DocumentCarrier>;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType, callback: CallbackType<DocumentCarrier, AWSError>): void;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType, settings: ModelUpdateSettings & {
        "return": "document";
    }): Promise<DocumentCarrier>;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType, settings: ModelUpdateSettings & {
        "return": "document";
    }, callback: CallbackType<DocumentCarrier, AWSError>): void;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType, settings: ModelUpdateSettings & {
        "return": "request";
    }): Promise<DynamoDB.UpdateItemInput>;
    update(this: Model<DocumentCarrier>, keyObj: ObjectType, updateObj: ObjectType, settings: ModelUpdateSettings & {
        "return": "request";
    }, callback: CallbackType<DynamoDB.UpdateItemInput, AWSError>): void;
    create(this: Model<DocumentCarrier>, document: ObjectType): Promise<DocumentCarrier>;
    create(this: Model<DocumentCarrier>, document: ObjectType, callback: CallbackType<DocumentCarrier, AWSError>): void;
    create(this: Model<DocumentCarrier>, document: ObjectType, settings: DocumentSaveSettings & {
        return: "request";
    }): Promise<DynamoDB.PutItemInput>;
    create(this: Model<DocumentCarrier>, document: ObjectType, settings: DocumentSaveSettings & {
        return: "request";
    }, callback: CallbackType<DynamoDB.PutItemInput, AWSError>): void;
    create(this: Model<DocumentCarrier>, document: ObjectType, settings: DocumentSaveSettings & {
        return: "document";
    }): Promise<DocumentCarrier>;
    create(this: Model<DocumentCarrier>, document: ObjectType, settings: DocumentSaveSettings & {
        return: "document";
    }, callback: CallbackType<DocumentCarrier, AWSError>): void;
    delete(this: Model<DocumentCarrier>, key: InputKey): Promise<void>;
    delete(this: Model<DocumentCarrier>, key: InputKey, callback: CallbackType<void, AWSError>): void;
    delete(this: Model<DocumentCarrier>, key: InputKey, settings: ModelDeleteSettings & {
        return: "request";
    }): DynamoDB.DeleteItemInput;
    delete(this: Model<DocumentCarrier>, key: InputKey, settings: ModelDeleteSettings & {
        return: "request";
    }, callback: CallbackType<DynamoDB.DeleteItemInput, AWSError>): void;
    delete(this: Model<DocumentCarrier>, key: InputKey, settings: ModelDeleteSettings & {
        return: null;
    }): Promise<void>;
    delete(this: Model<DocumentCarrier>, key: InputKey, settings: ModelDeleteSettings & {
        return: null;
    }, callback: CallbackType<void, AWSError>): void;
    get(this: Model<DocumentCarrier>, key: InputKey): Promise<DocumentCarrier>;
    get(this: Model<DocumentCarrier>, key: InputKey, callback: CallbackType<DocumentCarrier, AWSError>): void;
    get(this: Model<DocumentCarrier>, key: InputKey, settings: ModelGetSettings & {
        return: "document";
    }): Promise<DocumentCarrier>;
    get(this: Model<DocumentCarrier>, key: InputKey, settings: ModelGetSettings & {
        return: "document";
    }, callback: CallbackType<DocumentCarrier, AWSError>): void;
    get(this: Model<DocumentCarrier>, key: InputKey, settings: ModelGetSettings & {
        return: "request";
    }): DynamoDB.GetItemInput;
    get(this: Model<DocumentCarrier>, key: InputKey, settings: ModelGetSettings & {
        return: "request";
    }, callback: CallbackType<DynamoDB.GetItemInput, AWSError>): void;
    serializeMany(documentsArray: ModelType<DocumentCarrier>[], nameOrOptions: SerializerOptions | string): any;
}
export {};
