/*!
 * Copyright Sysdoc @ 2019
 */
/// <reference types="sharepoint" />
import { IListItemFormUpdateValue } from "@pnp/sp-commonjs";
import { IListFormData, IWeb } from "@pnp/sp-commonjs/presets/all";
import { FormFieldModel } from "@sysdoc/forms";
import { Dictionary, ILogger } from "@sysdoc/utilities";
import { ExecutorFn } from "../util/executor";
import { IPnPField } from "./IPnPField";
import { ISPFieldDecorator } from "./ISPFieldDecorator";
import { ISPFieldsFilterStrategy } from "./ISPFieldsFilterStrategy";
import { ISPListItem } from "./ISPListItem";
import { ISPListItemSerializer } from "./ISPListItemSerializer";
import { ISPListProvider } from "./ISPListProvider";
import { ISPListProviderDelegate } from "./ISPListProviderDelegate";
export interface ISPFieldSerializer<T> {
    fromJson(json: T, value: any): any;
    toJson(item: SP.ListItem, value: any): any;
}
declare type DecoratorMapping<T> = {
    [P in keyof T]?: ISPFieldDecorator<T, T[P]>;
};
declare type SerializerMapping<T> = {
    [P in keyof T]?: ISPFieldSerializer<T>;
};
export declare const DefaultReadOnlyFields: string[];
export declare type ItemCreationStrategy<T> = (obj: T, folderStrategy?: FolderCreationStrategy<T>) => Promise<SP.ListItemCreationInformation>;
export declare type FolderCreationStrategy<T> = (obj: T) => Promise<SP.Folder | string>;
export interface ISPListProviderConfig<T> {
    listTitle?: string;
    listId?: string;
    webUrl?: string;
    webId?: string;
    itemCreationStrategy?: ItemCreationStrategy<T>;
    folderCreationStrategy?: FolderCreationStrategy<T>;
    baseContentType?: string;
    fieldsDecorators?: DecoratorMapping<T>;
    fieldsSerializers?: SerializerMapping<T>;
    includeFields?: string[];
    readonlyFields?: string[];
    fields?: Dictionary<string>;
    logger: ILogger;
    fieldsFilterStrategy?: ISPFieldsFilterStrategy;
    supportsAttachments?: boolean;
    isOnPrem?: boolean;
}
export declare function getSPValue(def: IPnPField, item: SP.ListItem, value: any, ctx: SP.ClientContext, list: SP.List): any;
export declare class SPListProvider<T extends ISPListItem> implements ISPListProvider<number, T>, ISPListItemSerializer<T> {
    loadedWeb: any;
    $pnpList: IListFormData & {
        ParentWebUrl?: string;
    };
    $pnpWeb: IWeb;
    readonlyFields: string[];
    supportsAttachments: boolean;
    webId: string;
    fieldSerializers: SerializerMapping<T>;
    _ready: Promise<any>;
    listTitle: string;
    listId: string;
    logger: ILogger;
    includeFields: string[];
    webUrl: string;
    fields: Dictionary<string>;
    schema: Dictionary<IPnPField>;
    baseContentType: string;
    itemCreationStrategy?: ItemCreationStrategy<T>;
    folderCreationStrategy?: FolderCreationStrategy<T>;
    fieldDecorators: DecoratorMapping<T>;
    filterStrategy: ISPFieldsFilterStrategy;
    isOnPrem: boolean;
    constructor(cfg: ISPListProviderConfig<T>);
    createSchemaFromFields(fields: IPnPField[]): any;
    getObjectFromFields(fields: FormFieldModel<any>[]): T;
    getObjectFromFieldsOnline(fields: FormFieldModel<any>[]): T;
    getFormValuesFromFields(fields: FormFieldModel<any>[]): any[];
    itemToJson(item: SP.ListItem<any>): Partial<T>;
    serializeItem(json: T): Dictionary<string>;
    serializeItemFormValues(json: T): SP.ListItemFormUpdateValue[];
    jsonToItem(json: T, item: SP.ListItem<any>): SP.ListItem<any>;
    whenReady(): Promise<any>;
    onAddAttachment(item: SP.ListItem, file: File): Promise<unknown>;
    onAddAttachments(item: SP.ListItem, files: File[]): Promise<unknown[]>;
    getSchema(): Promise<Dictionary<IPnPField>>;
    setSchema(schema: Dictionary<IPnPField>): void;
    getItemVersion(id: number, exec: ExecutorFn): Promise<unknown>;
    updateAndIncreaseVersion(obj: T, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    update(obj: any, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    create(obj: T, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    createWithInclude(obj: T, include: string, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    save(obj: T, exec?: ExecutorFn): Promise<T>;
    getByQuery(query: SP.CamlQuery, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>[]>;
    getByQueryWithInclude(query: SP.CamlQuery, include: string[], exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>[]>;
    getById(itemId: number, include: string[], exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    get(key: number, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    getWithInclude(key: number, include: string, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<Partial<T>>;
    updateAndValidateField(id: number, fieldName: string, fieldValue: string): Promise<IListItemFormUpdateValue[]>;
    delete(key: number, exec?: ExecutorFn, delegate?: ISPListProviderDelegate<T>): Promise<void>;
    getDecorator<Value>(key: string): ISPFieldDecorator<Value, T>;
}
export {};
