/**
 * Official Type definitions for JSS Formula Premium
 * https://jspreadsheet.com/products/formulas
 */

declare function formula(expression: string, variables?: object, x?: number, y?: number, instance?: object): any

declare namespace formula {

    /**
     * Define custom formulas
     */
    function setFormula(formulas: Record<string, ((...args: any[]) => any) | null>) : void;
    function license(value: string | { clientId: string; licenseKey: string }) : void;

    /**
     * @deprecated Use Jspreadsheet defined names instead.
     */
    function define() : void;

    /**
     * @deprecated
     */
    function reset() : void;

    let adjustPrecision: boolean;
    let divisor: string;
    let debug: boolean;

    /**
     * Transform a formula before executed.
     * @param {string} expression
     * Example:
     * formula.onbeforeformula = (expression) => expression.replace(/\./g, '').replace(/\,/g, '.')
     */
    function onbeforeformula(expression: string) : string

    /**
     * Intercept formula errors.
     * @param {Error} error
     * @param {string} expression - SUM(A1,B2)
     * @param {object | undefined} variables - { A1: 1000, A2: 2000 }
     * @param {number | undefined} x - Cell column index
     * @param {number | undefined} y - Cell row index
     * @param {object | undefined} worksheet - Worksheet instance
     */
    function onerror(error: Error, expression: string, variables: object | undefined, x: number | undefined, y: number | undefined, worksheet: object | undefined) : void
}

export default formula;
