import { SharedModels } from '../shared/shared-models';
import { SharedContracts, AssetContracts } from '../../contracts';
export declare namespace AssetModels {
    class Asset implements SharedModels.IBaseModel<AssetContracts.IAssetModelContract> {
        id: string;
        fileName: string;
        title: string | null;
        imageWidth: number | null;
        imageHeight: number | null;
        size: number;
        type: string;
        fileReference: AssetFileReference;
        descriptions: AssetFileDescription[];
        externalId?: string;
        lastModified: Date;
        url: string;
        codename: string;
        collection?: IAssetCollectionReferenceObject;
        folder?: SharedContracts.IReferenceObjectContract;
        elements?: IAssetElement[];
        _raw: AssetContracts.IAssetModelContract;
        constructor(data: {
            id: string;
            fileName: string;
            title: string | null;
            imageWidth: number | null;
            imageHeight: number | null;
            size: number;
            type: string;
            fileReference: AssetFileReference;
            descriptions: AssetFileDescription[];
            externalId?: string;
            lastModified: Date;
            url: string;
            codename: string;
            collection?: IAssetCollectionReferenceObject;
            folder?: SharedContracts.IReferenceObjectContract;
            elements?: IAssetElement[];
            _raw: AssetContracts.IAssetModelContract;
        });
    }
    interface IAssetElement {
        element: SharedContracts.IIdReferenceContract;
        value: SharedContracts.IIdReferenceContract[];
    }
    interface IAssetFileReference {
        id: string;
        type: 'internal';
    }
    class AssetFileReference implements IAssetFileReference {
        id: string;
        type: 'internal';
        constructor(data: {
            id: string;
            type: 'internal';
        });
    }
    interface IAssetFileDescription {
        language: SharedContracts.IReferenceObjectContract;
        description: string;
    }
    interface IAssetCollectionReferenceObject {
        reference: SharedModels.IReferenceObject | null;
    }
    class AssetFileDescription {
        language: SharedModels.ReferenceObject;
        description: string | null;
        constructor(data: {
            language: SharedModels.ReferenceObject;
            description: string | null;
        });
    }
    interface IUploadBinaryFileRequestData {
        binaryData: any;
        contentType: string;
        contentLength?: number;
        filename: string;
    }
    /**
     * Currently only reference to taxonomy terms are supported. In future more elements will be allowed
     */
    type IAssetElementValueType = IAssetElementData<SharedContracts.IReferenceObjectContract[]>;
    interface IAssetElementData<TValue> {
        element: SharedContracts.IReferenceObjectContract;
        value: TValue;
    }
    interface IAddAssetRequestData {
        file_reference: IAssetFileReference;
        title?: string;
        external_id?: string;
        descriptions?: IAssetFileDescription[];
        folder?: SharedContracts.IReferenceObjectContract;
        elements?: IAssetElementValueType[];
        collection?: IAssetCollectionReferenceObject;
        codename?: string;
    }
    interface IUpsertAssetRequestData {
        descriptions: IAssetFileDescription[];
        title?: string;
        file_reference?: IAssetFileReference;
        folder?: SharedContracts.IReferenceObjectContract;
        collection?: IAssetCollectionReferenceObject;
        elements?: IAssetElementValueType[];
    }
    interface IUploadAssetFromUrlRequestData {
        asset: {
            title?: string;
            external_id?: string;
            descriptions?: IAssetFileDescription[];
            folder?: SharedContracts.IReferenceObjectContract;
            elements?: IAssetElementValueType[];
            collection?: IAssetCollectionReferenceObject;
            codename?: string;
        };
        binaryFile: {
            filename: string;
        };
        fileUrl: string;
    }
}
