declare module 'fontmanager-redux' {
    export interface FontDescriptor {
        readonly path: string;
        readonly style: string;
        readonly width: number;
        readonly family: string;
        readonly weight: number;
        readonly italic: boolean;
        readonly monospace: boolean;
        readonly postscriptName: string;
    }

    export interface QueryFontDescriptor {
        readonly path?: string;
        readonly style?: string;
        readonly width?: number;
        readonly family?: string;
        readonly weight?: number;
        readonly italic?: boolean;
        readonly monospace?: boolean;
        readonly postscriptName?: string;
    }

    /**
     * Fetches fonts in the system
     *
     * @example
     * getAvailableFontsSync();
     * @returns All fonts descriptors available
     */
    export function getAvailableFontsSync(): FontDescriptor[];

    /**
     * Returns trough a callback all fonts descriptors available on the system
     *
     * @param callback Contains the font data
     * @example
     * getAvailableFonts((fonts) => { ... });
     */
    export function getAvailableFonts(callback: (fonts: FontDescriptor[]) => void): void;

    /**
     * Queries all the fonts in the system matching the given parameters
     *
     * @param fontDescriptor Query parameters
     * @example
     * findFontsSync({ family: 'Arial' });
     * findFontsSync();
     * @returns All fonts descriptors matching query parameters
     */
    export function findFontsSync(fontDescriptor: QueryFontDescriptor | undefined): FontDescriptor[];

    /**
     * Queries all the fonts in the system matching the given parameters
     *
     * @param fontDescriptor Query parameters
     * @param callback Contains the font data
     * @example
     * findFonts({ family: 'Arial' }, (fonts) => { ... });
     * findFonts((fonts) => { ... });
     */
    export function findFonts(fontDescriptor: QueryFontDescriptor | undefined, callback: (fonts: FontDescriptor[]) => void);

    /**
     * Find only one font matching the given query. This function always returns
     * a result (never null), so sometimes the output will not exactly match the
     * input font descriptor if not all input parameters could be met
     *
     * @param fontDescriptor Query parameters
     * @example
     * findFontSync({ family: 'Arial', weight: 700 });
     * findFontSync();
     * @returns Only one font description matching those query parameters
     */
    export function findFontSync(fontDescriptor: QueryFontDescriptor): FontDescriptor;

    /**
     * Find only one font matching the given query. This function always returns
     * a result (never null), so sometimes the output will not exactly match the
     * input font descriptor if not all input parameters could be met
     *
     * @param fontDescriptor Query parameters
     * @example
     * findFont({ family: 'Arial', weight: 700 }, (font) => { ... });
     * findFont((font) => { ... });
     * @returns Only one font description matching those query parameters
     */
    export function findFont(fontDescriptor: QueryFontDescriptor | undefined, callback: (font: FontDescriptor) => void);

    /**
     * Substitutes the font with the given post script name with another font
     * that contains the characters in text. If a font matching post script
     * name is not found, a fount containing the given characters is still
     * returned. If a font matching post script name is found, its
     * characteristics (bold, italic, etc) are used to find a suitable
     * replacement. If the font already contains the characters in text, it is
     * not replaced and the font descriptor for the original font is returned
     *
     * @param postscriptName Name of the font to be replaced
     * @param text Characters for matching
     * @returns Only one font description matching the function description
     */
    export function substituteFontSync(postscriptName: string, text: string): FontDescriptor;

    /**
     * Substitutes the font with the given post script name with another font
     * that contains the characters in text. If a font matching post script
     * name is not found, a fount containing the given characters is still
     * returned. If a font matching post script name is found, its
     * characteristics (bold, italic, etc) are used to find a suitable
     * replacement. If the font already contains the characters in text, it is
     * not replaced and the font descriptor for the original font is returned
     *
     * @param postscriptName Name of the font to be replaced
     * @param text Characters for matching
     */
    export function substituteFont(postscriptName: string, text: string, callback: (font: FontDescriptor) => void);
}
