/**
 * @module Zakeke
 */
import { FocusAttributesEventListener } from '@zakeke/zakeke-3d-core';
import { EventMessage, FontFamily, Group, Item, NftForm, NftSettings, OnBeforeSendDataToParent, PrintingMethodsRestrictions, Product, Template, TemplateMacroCategory, TextSanitationResult, Translations, UIConfig, VisibleEventMessage } from '..';
import { Camera, ImageMacroCategory, ProductQuantityRule, SellerSettings, TemplateUploadRestrictictions, ZakekeImage } from '../models';
interface RestrictionColor {
    colorCode: string;
    isDefault: boolean;
}
interface CustomPreviewSize {
    customCartPreviewWidth: number;
    customCartPreviewHeight: number;
}
interface ThemeCompositions {
    name: string;
    docID: string;
    previewImageUrl: string;
    tags: string[];
}
/**
 * Contains all the data and methods to control a Zakeke configuration
 */
export interface Zakeke {
    /**
     * @internal
     */
    internalProduct: MPlaza.Model | null;
    /**
     * @internal
     */
    internalScene: Zakeke.Scene | null;
    /**
     * @internal
     */
    internalCurrentTemplate: MPlaza.Design | null | undefined;
    /**
     * The current price of the configuration plus the product price
     */
    price: number;
    isOutOfStock: boolean;
    culture: string;
    currency: string;
    isSceneLoading: boolean;
    isAddToCartLoading: boolean;
    isInfoPointContentVisible: boolean;
    isViewerReady: boolean;
    fonts: FontFamily[];
    disableTextColors: boolean;
    defaultColor: string;
    textColors: RestrictionColor[];
    groups: Group[];
    templates: Template[];
    loadedComposition: {
        templateName: string;
        attributesOptions: Map<number, number>;
        selectedCategoryID: number | null;
    } | null;
    currentTemplate: Template | null;
    items: Item[];
    productName: string;
    productCode: string;
    product: Product | null;
    cameras: Camera[];
    sellerSettings: SellerSettings | null;
    quantityRule: ProductQuantityRule | null;
    eventMessages: EventMessage[] | null;
    personalizedMessages: EventMessage[] | null;
    visibleEventMessages: VisibleEventMessage[];
    isAssetsLoading: boolean;
    draftCompositions: ThemeCompositions[] | null;
    additionalCustomProperties: {
        name: string;
        value: number;
        label: string;
        formatString: string;
    }[] | null;
    currentAttributesSelection: object | null;
    currentCompositionInfo: {
        compositionId: string | null;
        compositionName: string | null;
        compositionTags: string[] | null;
    } | null;
    translations: Translations | null;
    nftSettings: NftSettings | null;
    useLegacyScreenshot: boolean;
    isAIEnabled: boolean;
    uiConfig: UIConfig | null;
    backgroundColor: string;
    removeBackground: boolean;
    deepARsceneGLBUrl: string | null;
    getDeepARDesktopIframeUrl: () => Promise<string>;
    setMouseWheelZoomEnabled: (enabled: boolean) => void;
    setCameraPinchingZoom: (toggle: boolean) => void;
    selectOption: (optionId: number) => void;
    /**
     * @internal
     */
    internalAppendViewer: (container: HTMLElement) => void;
    getPrintingMethodsRestrictions: () => PrintingMethodsRestrictions;
    designUpdate: () => void;
    createQuote: (formData: any) => Promise<any>;
    setTemplate: (templateId: number) => Promise<void>;
    isAreaVisible: (areaId: number) => boolean;
    quantity: number;
    saveTemplate: (templateName: string, selectedCategoryID: number | null, attributesOptions: Map<number, number>) => Promise<void>;
    addToCart: (additionalProperties: Record<string, any>, OnBeforeSendDataToParent?: (data: OnBeforeSendDataToParent) => Promise<Record<string, any>>, legacyScreenshot?: boolean, nftForm?: NftForm) => Promise<void>;
    /**
     * Create a PDF of the current configuration
     * @returns The URL of the PDF
     */
    getPDF: () => Promise<string>;
    getOnlineScreenshot: (width: number, height: number, legacyScreenshot?: boolean, backgroundColor?: string, padding?: number) => Promise<{
        originalUrl: string;
        rewrittenUrl: string;
    }>;
    setCamera: (id: string, onlyAngleOfView?: boolean, animate?: boolean) => void;
    setCameraByName: (name: string, onlyAngleOfView?: boolean, animate?: boolean) => void;
    setCameraZoomEnabled: (enabled: boolean) => void;
    resetCameraPivot: () => void;
    setCameraPivot: (meshId: string) => void;
    fullyLoadFont: (fontFamily: string | FontFamily) => Promise<FontFamily>;
    sanitizeString: (family: FontFamily, text: string) => string;
    getSanitationText: (family: FontFamily, text: string) => TextSanitationResult;
    getImages: (categoryId: number) => Promise<ZakekeImage[]>;
    getMacroCategories: () => Promise<ImageMacroCategory[]>;
    previewOnly__setItemImageFromBase64: (guid: string, base64: string) => void;
    setItemImageFromFile: (guid: string, file: File) => Promise<void>;
    addItemImage: (id: number, areaId: number) => Promise<void>;
    /**
     * Upload an image and get the uploaded image
     * @param file The file to upload
     * @param progress A callback to get the upload progress
     * @returns The uploaded image
     */
    createImage: (file: File, progress?: (percentage: number) => void) => Promise<ZakekeImage>;
    createImageFromUrl: (url: string) => Promise<ZakekeImage>;
    setItemImage: (guid: string, imageId: number) => Promise<void>;
    setItemFontFamily: (guid: string, fontFamily: string) => void;
    setItemColor: (guid: string, color: string) => void;
    setItemBold: (guid: string, bold: boolean) => void;
    setItemItalic: (guid: string, italic: boolean) => void;
    setItemTextOnPath: (guid: string, areaId: number, value: boolean) => void;
    setItemText: (guid: string, text: string) => string;
    addItemText: (settings: {
        text: string;
        fontFamily: string;
    }, areaId: number) => Promise<void>;
    /**
     * Remove an item from the customization
     * @param guid The guid of the item to remove
     */
    removeItem: (guid: string) => Promise<void>;
    setQuantity: (quantity: number) => void;
    getShareCompositionUrl: () => Promise<string>;
    saveComposition: (customPreviewSize?: CustomPreviewSize) => Promise<void>;
    loadComposition: (id: string) => Promise<void>;
    switchFullscreen: () => void;
    openSecondScreen: () => void;
    isFullscreenMode: boolean;
    zoomIn: () => void;
    zoomOut: () => void;
    updateView: (adjustCamera?: boolean) => void;
    setHighlightSettings: (settings: {
        color: string;
        size: number;
    }) => void;
    hasExplodedMode: () => boolean;
    isExplodedMode: boolean;
    setExplodedMode: (exploded: boolean) => void;
    getMeshIDbyName: (name: string) => string | undefined | null;
    hideMeshAndSaveState: (meshId: string) => void;
    restoreMeshVisibility: (meshId: string) => void;
    setMeshDesignVisibility: (meshId: string, visible: boolean) => void;
    clearListeners: () => void;
    addFocusAttributesListener: (listenerFunction: FocusAttributesEventListener) => void;
    focusAttribute: (attributeId: number) => void;
    highlightGroup: (groupId: number) => void;
    highlightAttribute: (attributeId: number) => void;
    getQrCodeArUrl: (device: 'iOS' | 'Android') => Promise<string>;
    getMobileArUrl: () => Promise<Blob | string | null>;
    openArMobile: (url: string) => void;
    isSceneArEnabled: () => boolean;
    isArDeviceCompliant: () => boolean;
    IS_ANDROID: boolean;
    IS_IOS: boolean;
    setBackgroundColor: (color: string, alpha: number) => void;
    getTryOnUrl: (tryOnUrl?: string) => Promise<string>;
    isSceneTryOnEnabled: () => boolean;
    setCameraLocked: (isBlocked: boolean) => void;
    getTemplateUploadRestrictictions: (templateId: number, areaId: number) => TemplateUploadRestrictictions;
    saveDraftsComposition: (name: string, tags: string[], isCopy?: boolean) => Promise<void>;
    loadSavedComposition: (docID: string) => Promise<void>;
    deleteSavedComposition: (docId: string) => Promise<void>;
    exportSceneToGlb: () => Promise<string | Blob | null>;
    reset: () => Promise<void>;
    undo: () => Promise<void>;
    redo: () => Promise<void>;
    getCopyrightMessageAccepted: () => boolean;
    setCopyrightMessageAccepted: (copyrightMandatoryCheckbox: boolean) => void;
    validationNFTEmail: (email: string) => boolean;
    validationNFTWalletAddress: (walletAddress: string) => boolean;
    templateMacroCategories: TemplateMacroCategory[] | null;
    applyTemplate: (templateGroupCompositionId: number) => Promise<void>;
    configureByAI: (text: string) => Promise<void>;
    hasVTryOnEnabled: boolean;
    canUseTryOn: boolean;
    canUsePD: boolean;
    getTryOnSettings: () => Zakeke.TryOnSettings | undefined;
    isTryOnMeshVisible: boolean;
    isMandatoryPD: boolean;
    isVisibleMeshShownForTryOn: boolean;
    setPDDistance: (distance: number) => void;
    pdDistance: () => number;
    exportTryOnMeshToGlb: () => Promise<string | Blob | null>;
}
export {};
