/**
 * Official Type definitions for LemonadeJS plugins
 * https://lemonadejs.net
 * Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
 */

declare function Component(el: HTMLElement, options?: Component.Options): Component.Instance;

interface Snippet {
    /** Image URL */
    image: string | string[];
    /** Title */
    title: string;
    /** Description */
    description: string;
    /** Domain */
    host: string;
    /** Link */
    url: string;
}

declare namespace Component {
    interface Options {
        /** Load data from a remove location */
        url?: string;
        /** Initial HTML string for the editor */
        value?: string;
        /** Snippet object */
        snippet?: Snippet;
        /** Show toolbar */
        toolbar?: boolean;
        /** Show the toolbar in the top of the editor. Default: false */
        toolbarOnTop?: boolean;
        /** Website URL parser is to read websites and images from cross domain */
        remoteParser?: string;
        /** Editor place holder */
        placeholder?: string;
        /** Filter the paste. Default true. */
        filterPaste?: boolean;
        /** Accept images or files to be dropped in the editor area. Default: true */
        dropZone?: boolean;
        /** Transform dropped images as snippet. Default: false */
        dropAsSnippet?: boolean;
        /** Accept images when the dropzone when active. Default: true */
        acceptImages?: boolean;
        /** Accept files when the dropzone when active. Default: false */
        acceptFiles?: boolean;
        /** Max file size in bytes. Default: 5000000 bytes */
        maxFileSize?: number | null;
        /** Allow image resizing. Default: true */
        allowImageResize?: boolean;
        /** Max height editor */
        maxHeight?: number | null;
        /** Default editor height */
        height?: number | null;
        /** Focus in the editor when initiated. Default: false */
        focus?: boolean;
        /** Onclick in the editor */
        onclick?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** When the editor is focused */
        onfocus?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** When blur */
        onblur?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** When the editor is ready */
        onload?: (el: HTMLElement, obj: Editor, editor: HTMLElement) => void;
        /** When key up in the editor */
        onkeyup?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** When key down in the editor */
        onkeydown?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** When the value of the editor changes */
        onchange?: (el: HTMLElement, obj: Editor, e: MouseEvent) => void;
        /** Editor extensions */
        extensions?: Record<string, Function>;
    }

    interface Instance {
        /** Dropped files or loaded via the input file */
        addFiles: (files: FileList[]) => void;
        /** Methods to add new images to the editor */
        addImage: (src: string | FileList[], asSnippet?: boolean) => void;
        /** Add a new PDF as a attachment */
        addPdf: (base64: string) => void;
        /** Add a snippet board in the editor */
        appendSnippet: (data: Snippet) => void;
        /** Destroy */
        destroy: () => void;
        /** Editor HTML container */
        el: HTMLElement;
        /** HTML input upload element */
        file: HTMLInputElement;
        /** Get the data from the editor */
        getData: (asJson?: boolean) => string | object;
        /** Get the files loaded to the editor */
        getFiles: () => string[];
        /** Get the innerText from the editor */
        getText: () => string;
        /** Editor configuration */
        options: Component.Options;
        /** Reset the editor value */
        reset: () => void;
        /** Load a file from a local computer to the editor */
        upload: () => void;
        /** Internal type */
        type: 'editor';
    }
}

interface Editor {
    (): any
    [key: string]: any
}

declare function Editor<Editor>(props: Component.Options): any;
export default Editor;
