import { U, StrRemoveSome, If_StrIncludes, Or, Equal } from "typescript-treasure";

export type InjectDataFn<Expr> = <const Data>
    (fill_data: Data extends string | number | undefined | null ? never : Data) =>
    (
        If_HasNumFmt<Expr, Data> extends true ?
        number | GetWrapErr<Data>
        :
        string | GetWrapErr<Data>
    );


export type InjectExprFn<Data> = <const Expr>
    (expr: Expr extends string | number ? Expr : never) =>
    (
        If_HasNumFmt<Expr, Data> extends true ?
        number | GetWrapErr<Data>
        :
        string | GetWrapErr<Data>
    );


type If_IncludesVar<T> = U.If_IncludeVar<StrRemoveSome<T, ["!n", "!e", "!u", "!N", "!E", "!U"]>>;


type If_NumOrStr<T> = T extends string | number ? true : false;
type If_FillData<T> = T extends string | number | undefined | null ? false : true;
type Not<T> = T extends true ? false : true;

type GetWrapErr<T> = T extends { _error: infer I; } ? I : "-";
type GetFmt<T> = T extends { _fmt: infer I; } ? I : never;

type If_HasNumFmt<Expr, Data> =
    Or<
        If_StrIncludes<Expr, ["!n"]> | If_StrIncludes<GetFmt<Data>, ["!n"]>
    >;


type DirectReturn<Expr, Data> =
    If_HasNumFmt<Expr, Data> extends true ?
    (
        number | GetWrapErr<Data>
    )
    :
    (
        string | GetWrapErr<Data>
    );


type FuncReturn<Arg1> =
    If_IncludesVar<Arg1> extends true ?
    (
        InjectDataFn<Arg1>
    )
    :
    (
        If_FillData<Arg1> extends true ?
        InjectExprFn<Arg1>
        :
        never
    );

type If_DirectReturn<Arg1, Arg2> =
    Or<
        If_NumOrStr<Arg1> & If_FillData<Arg2>
        |
        If_NumOrStr<Arg1> & Not<If_IncludesVar<Arg1>>
    >;

/**
 * calc/calc_space 运行时选项类型（可以包含数据和配置）
 */
type CalcRuntimeOptions<Fmt extends string, Err> =
    any[] | Partial<{
        _error: Err;
        _fmt: Fmt;
        _unit: boolean;
        _debug?: boolean;
        _on_debug?: (info: any) => void;
        _angle_unit?: 'deg' | 'rad';
        _compact_symbols?: string[];
        _compact_step?: number | number[];
        _thousands?: Record<string, ThousandsPreset>;
        /** 多路取值时视为空值的值数组（仅运行时选项） */
        _empty_values?: any[];
        /** 多路取值时自定义空值判断函数（仅运行时选项） */
        _empty_check?: (value: any, path?: string) => boolean;
        [key: string]: any;  // 允许任意数据字段
    }>;

export type Calc = <const Expr extends string | number, const Fmt extends string, const Err = never>
    (expr: Expr, options?: CalcRuntimeOptions<Fmt, Err>) =>
    (
        If_StrIncludes<Fmt, ["!n"]> & If_StrIncludes<Expr, ["!n"]> extends true ?
        number | Err
        :
        string | Err
    );

export type CalcSpace = <const Expr extends string | number, const Fmt extends string, const Err = never>
    (expr: Expr, options?: CalcRuntimeOptions<Fmt, Err>) =>
    (
        If_StrIncludes<Fmt, ["!n"]> & If_StrIncludes<Expr, ["!n"]> extends true ?
        number | Err
        :
        string | Err
    );

export type CalcSum = <const Expr extends string | number, const Fmt extends string, const Err = never>
    (expr: Expr, options: Array<CalcRuntimeOptions<Fmt, Err>>) =>
    (
        If_StrIncludes<Fmt, ["!n"]> & If_StrIncludes<Expr, ["!n"]> extends true ?
        number | Err
        :
        string | Err
    );

/**
 * fmt 格式化选项（运行时选项）
 * 注意：单位转换相关配置（_unit_convert_out 等）只能通过 set_config 全局设置
 */
export interface FmtOptions {
    _error?: any;
    _fmt?: string;
    /** 紧凑格式符号数组（临时覆盖） */
    _compact_symbols?: string[];
    /** 紧凑格式阶梯值（临时覆盖） */
    _compact_step?: number | number[];
    /** 千分位预设配置 */
    _thousands?: Record<string, ThousandsPreset>;
    /** 多路取值时视为空值的值数组 */
    _empty_values?: any[];
    /** 多路取值时自定义空值判断函数 */
    _empty_check?: (value: any, path?: string) => boolean;
    [key: string]: any;
}

/**
 * fmt 函数类型
 * 直接格式化数字，跳过表达式解析
 */
export interface Fmt {
    <const FmtStr extends string | undefined = undefined, const Err = never>(
        value: number | string,
        format_str?: FmtStr,
        options?: FmtOptions & { _error?: Err }
    ): If_StrIncludes<FmtStr, ["!n"]> extends true ? number | Err : string | Err;
}

export interface CalcWrap {
    <const Expr extends string | number>
        (expr: Expr): If_IncludesVar<Expr> extends true ? FuncReturn<Expr> : If_StrIncludes<Expr, ["!n", "!N"]> extends true ? number | "-" : string | "-";

    <const Expr extends string | number, const Fmt extends string, const Err, const Options extends CalcRuntimeOptions<Fmt, Err>>
        (expr: Expr, options: Options): DirectReturn<Expr, Options>;

    <const Fmt extends string, const Err, const Options extends CalcRuntimeOptions<Fmt, Err>>
        (options: Options): FuncReturn<Options>;
}

/**
 * 传入字符串算术式或数字返回计算的结果（标准语法）
 * @param expr 一个字符串算术式或一个数字
 * @param options 一个配置或者用来填充算术式的数据源,或者两者的结合
 * @returns 返回进过计算和格式化之后的结果,结果可能是字符串或数字或自定义的错误类型
 *
 * @example:
 * ```typescript
 * calc("a + b", {a: 1, b: 2}) // 3
 * calc("1.00") // 1
 * calc("1.00 | =3") // 1.000
 * calc("a + b | =2", {a: 0.1, b: 0.2}) // 0.30
 * calc("a++(b", {_error: null}) // null
 * calc("1% + 2%", {_unit: true}) // 3%
 * ```
 */
export const calc: Calc;

/**
 * 空格语法计算函数
 * 使用空格分隔的语法，支持所有 3.x 新功能（千分位预设、格式化分组、范围限制等）
 * @param expr 一个字符串算术式或一个数字（使用空格语法）
 * @param options 一个配置或者用来填充算术式的数据源,或者两者的结合
 * @returns 返回进过计算和格式化之后的结果,结果可能是字符串或数字或自定义的错误类型
 *
 * @example:
 * ```typescript
 * calc_space("a + b", {a: 1, b: 2}) // 3
 * calc_space("1 + 2 * 3 | = 2") // "7.00"
 * calc_space("100 | , = 2") // "100.00"
 * calc_space("1000000 | @cn") // "1,000,000"（使用千分位预设）
 * calc_space("100 | % = 2") // "100.00%"
 * ```
 */
export const calc_space: CalcSpace;

/**
 * 传入字符串算术式和数据源的数组进行计算并最终归集，这个方法类似 options_arr.reduce((memo, data) => calc("expr + memo", {expr, memo, _fill_data: data}), 0)
 * @param expr 一个字符串算术式或一个数字
 * @param options_arr 数据源的集合
 * @returns 返回进过计算和格式化并归集之后的结果,结果可能是字符串或数字或自定义的错误类型
 *
 * @example:
 * ```typescript
 * calc_sum("a + 1", [{a: 1}, {a: 2}]) // 5
 * ```
 */
export const calc_sum: CalcSum;

/**
 * 计算数组中每个元素的表达式值并求平均值
 * @param expr 一个字符串算术式，可包含格式化指令
 * @param options_arr 数据源的集合
 * @returns 返回平均值结果
 *
 * @example:
 * ```typescript
 * calc_avg("score", [{score: 80}, {score: 90}, {score: 100}]) // '90'
 * calc_avg("score | =2", [{score: 80}, {score: 90}]) // '85.00'
 * ```
 */
export const calc_avg: CalcSum;

/**
 * 计算数组中每个元素的表达式值并返回最大值
 * @param expr 一个字符串算术式，可包含格式化指令
 * @param options_arr 数据源的集合
 * @returns 返回最大值结果
 *
 * @example:
 * ```typescript
 * calc_max("price", [{price: 10}, {price: 30}, {price: 20}]) // '30'
 * calc_max("price * qty | =2", [{price: 10, qty: 2}, {price: 5, qty: 3}]) // '20.00'
 * ```
 */
export const calc_max: CalcSum;

/**
 * 计算数组中每个元素的表达式值并返回最小值
 * @param expr 一个字符串算术式，可包含格式化指令
 * @param options_arr 数据源的集合
 * @returns 返回最小值结果
 *
 * @example:
 * ```typescript
 * calc_min("price", [{price: 10}, {price: 30}, {price: 20}]) // '10'
 * calc_min("stock | =0", [{stock: 50}, {stock: 10}, {stock: 30}]) // '10'
 * ```
 */
export const calc_min: CalcSum;

/**
 * 统计数组中表达式结果为真值（非零）的数量
 * @param expr 一个字符串算术式，可包含格式化指令
 * @param options_arr 数据源的集合
 * @returns 返回满足条件的数量
 *
 * @example:
 * ```typescript
 * calc_count("stock > 0", [{stock: 10}, {stock: 0}, {stock: 5}]) // '2'
 * calc_count("active", [{active: 1}, {active: 0}, {active: 1}]) // '2'
 * ```
 */
export const calc_count: CalcSum;

/**
 * 专用格式化函数，用于对数字进行格式化处理
 * 相比 calc，它跳过表达式解析，性能更好
 *
 * 支持多种调用方式：
 * 1. 新 API: fmt(100, '=2') - 直接格式化数字，性能最好
 * 2. 旧 API: fmt('100 | =2') - calc 风格（向后兼容）
 * 3. 旧 API: fmt(100, { _fmt: '=2' }) - 对象选项风格（向后兼容）
 *
 * @param value 要格式化的数字，或包含 | 的 calc 风格表达式
 * @param format_str 格式化字符串，或选项对象（旧 API 兼容）
 * @param options 可选配置项
 * @returns 返回格式化后的结果
 *
 * @example:
 * ```typescript
 * // 新 API（推荐）
 * fmt(100, '=2')           // '100.00'
 * fmt(1234567, ',')        // '1,234,567'
 * fmt(0.1234, '%=2')       // '12.34%'
 *
 * // 旧 API（向后兼容）
 * fmt('100 | =2')          // '100.00'
 * fmt('num | ,', { num: 1234567 })  // '1,234,567'
 * fmt(100, { _fmt: '=2' }) // '100.00'
 * ```
 */
export const fmt: Fmt;
/**
 * calc方法的包装版本,除了支持calc所有的功能还额外提供了更强大的类型推导和更灵活的编写方式
 * @param expr 一个字符串算术式或一个数字
 * @param options 一个配置或者用来填充算术式的数据源,或者两者的结合
 * @returns 返回进过计算和格式化之后的结果,结果可能是字符串或数字或自定义的错误类型
 *
 * @example:
 * ```typescript
 * // 先传入表达式还是先注入数据源都是可以的
 * calc_wrap("a + b")({a: 1, b: 2}) // 3
 * calc_wrap("a + b",{a: 1, b: 2}) // 3
 * calc_wrap({a: 0.1, b: 0.2})("a + b | =2") // 0.30
 * ```
 */
export const calc_wrap: CalcWrap;

/**
 * 当前库版本号
 */
export const version: string;

/**
 * 工具函数集合
 */
export const calc_util: {
    /**
     * 检查当前库是否有更新版本
     */
    check_update(): void;
    /**
     * 打印当前库的版本
     */
    print_version(): void;
};

export const parse_thousands: (str: string) => string;

// ==================== 原始运算函数类型 ====================

type NumOrStr = number | string;
type TypeArg = "number" | "string";

/**
 * 二元运算函数类型（支持多参数）
 * - 默认返回 number
 * - 最后一个参数为 "string" 时返回 string
 * - 最后一个参数为 "number" 时返回 number
 */
interface BinaryOp {
    // 无参数
    (): number;
    // 单参数
    (a: NumOrStr): number;
    (a: NumOrStr, type: "string"): string;
    (a: NumOrStr, type: "number"): number;
    // 双参数（兼容旧版）
    (a: NumOrStr, b: NumOrStr): number;
    (a: NumOrStr, b: NumOrStr, type: "string"): string;
    (a: NumOrStr, b: NumOrStr, type: "number"): number;
    // 三参数
    (a: NumOrStr, b: NumOrStr, c: NumOrStr): number;
    (a: NumOrStr, b: NumOrStr, c: NumOrStr, type: "string"): string;
    (a: NumOrStr, b: NumOrStr, c: NumOrStr, type: "number"): number;
    // 四参数
    (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr): number;
    (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr, type: "string"): string;
    (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr, type: "number"): number;
    // 更多参数（fallback）
    (...args: NumOrStr[]): number | string;
}

/**
 * 一元运算函数类型
 */
interface UnaryOp {
    (value: NumOrStr): number;
    (value: NumOrStr, type: "string"): string;
    (value: NumOrStr, type: "number"): number;
}

/**
 * 加法 - 支持多参数
 * @example
 * add(1, 2)           // => 3 (number)
 * add(1, 2, 3, 4)     // => 10 (number)
 * add(1, 2, "string") // => "3" (string)
 */
export const add: BinaryOp;

/**
 * 减法 - 支持多参数
 * @example
 * sub(10, 3)           // => 7 (number)
 * sub(10, 3, 2)        // => 5 (number)
 * sub(10, 3, "string") // => "7" (string)
 */
export const sub: BinaryOp;

/**
 * 乘法 - 支持多参数
 * @example
 * mul(2, 3)            // => 6 (number)
 * mul(2, 3, 4)         // => 24 (number)
 * mul(2, 3, "string")  // => "6" (string)
 */
export const mul: BinaryOp;

/**
 * 除法 - 支持多参数
 * @example
 * div(100, 2)          // => 50 (number)
 * div(100, 2, 5)       // => 10 (number)
 * div(10, 0)           // throws Error or returns _error
 */
export const div: BinaryOp;

/**
 * 取模 - 支持多参数
 * @example
 * mod(10, 3)           // => 1 (number)
 * mod(10, 3, "string") // => "1" (string)
 */
export const mod: BinaryOp;

/**
 * 幂运算 - 支持多参数（右结合）
 * @example
 * pow(2, 3)            // => 8 (number)
 * pow(2, 3, 2)         // => 512 (number) = 2^(3^2)
 */
export const pow: BinaryOp;

/**
 * 整除 - 支持多参数
 * @example
 * idiv(10, 3)          // => 3 (number)
 * idiv(100, 7, 2)      // => 7 (number)
 */
export const idiv: BinaryOp;

/**
 * 绝对值
 * @example
 * abs(-5)              // => 5 (number)
 * abs(-5, "string")    // => "5" (string)
 */
export const abs: UnaryOp;

/**
 * 取负
 * @example
 * neg(5)               // => -5 (number)
 * neg(-5, "string")    // => "5" (string)
 */
export const neg: UnaryOp;

/**
 * 平方根
 * @example
 * sqrt(16)             // => 4 (number)
 * sqrt(2, "string")    // => "1.4142135623730950488" (string)
 */
export const sqrt: UnaryOp;

/**
 * 自然对数
 * @example
 * ln(Math.E)           // => 1 (number)
 * ln(10, "string")     // => "2.302585..." (string)
 */
export const ln: UnaryOp;

/**
 * e 的 x 次方
 * @example
 * exp(1)               // => 2.718281828... (number)
 * exp(0, "string")     // => "1" (string)
 */
export const exp: UnaryOp;

// ==================== 链式计算 API ====================

/**
 * 链式计算返回值类型
 * 可以直接调用获取结果，也可以继续链式调用
 */
export interface ChainValue {
    /** 获取结果，可选传入格式化字符串 */
    (format?: string): string;
    /** 链式加法 */
    add(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式减法 */
    sub(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式乘法 */
    mul(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式除法 */
    div(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式取模 */
    mod(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式幂运算 */
    pow(...nums: (NumOrStr | ChainValue)[]): ChainValue;
    /** 链式整除 */
    idiv(...nums: (NumOrStr | ChainValue)[]): ChainValue;
}

/**
 * 链式加法起始
 * @example
 * cadd(1, 2, 3)()           // => "6"
 * cadd(1, 2).mul(3)()       // => "9"
 * cadd(100).sub(50)("=2")   // => "50.00"
 */
export function cadd(...nums: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式减法起始
 * @example
 * csub(10, 3)()             // => "7"
 * csub(100, 50).div(2)()    // => "25"
 */
export function csub(first: NumOrStr | ChainValue, ...rest: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式乘法起始
 * @example
 * cmul(2, 3, 4)()           // => "24"
 * cmul(10).add(5)()         // => "15"
 */
export function cmul(...nums: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式除法起始
 * @example
 * cdiv(100, 2)()            // => "50"
 * cdiv(100, 2, 5)()         // => "10"
 */
export function cdiv(first: NumOrStr | ChainValue, ...rest: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式取模起始
 * @example
 * cmod(10, 3)()             // => "1"
 */
export function cmod(first: NumOrStr | ChainValue, ...rest: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式幂运算起始
 * @example
 * cpow(2, 3)()              // => "8"
 */
export function cpow(first: NumOrStr | ChainValue, ...rest: (NumOrStr | ChainValue)[]): ChainValue;

/**
 * 链式整除起始
 * @example
 * cidiv(10, 3)()            // => "3"
 */
export function cidiv(first: NumOrStr | ChainValue, ...rest: (NumOrStr | ChainValue)[]): ChainValue;

// ==================== 计算模式 ====================

/**
 * 计算模式类型
 */
export type ComputeMode = 'decimal' | 'bigint' | 'wasm';

/**
 * 角度单位类型
 */
export type AngleUnit = 'deg' | 'rad';

/**
 * 单位转换规则类型
 */
export type UnitConvertRule =
    | number
    | ((value: number, input_unit: string, output_unit: string) => number)
    | {
        mul?: number;
        div?: number;
        plus?: number;
        minus?: number;
        fn?: (value: number, input_unit: string, output_unit: string) => number;
        _position?: 'before' | 'after' | 'middle';
        _thousands?: string;
        _compact?: string;
    };

/**
 * 单位转换映射类型（输出单位为key）
 */
export type UnitConvertOut = Record<string, Record<string, UnitConvertRule> & {
    _position?: 'before' | 'after' | 'middle';
    _thousands?: string;
    _compact?: string;
}>;

/**
 * 单位转换映射类型（输入单位为key）
 */
export type UnitConvertIn = Record<string, Record<string, UnitConvertRule>>;

/**
 * 千分位预设名称（系统内置）
 * - en: 英文/国际标准 (1,234,567.89)
 * - eu: 欧洲大陆格式 (1.234.567,89)
 * - swiss: 瑞士格式 (1'234'567.89)
 * - space: 空格分隔/ISO标准 (1 234 567.89)
 * - fr: 法国格式 (1 234 567,89 - 使用不换行空格)
 * - indian: 印度格式 (12,34,567.89)
 * - wan: 万进制/东亚格式 (123,4567.89)
 */
export type ThousandsPresetName = 'en' | 'eu' | 'swiss' | 'space' | 'fr' | 'indian' | 'wan';

/**
 * 紧凑格式预设名称（系统内置）
 * - en: 英文/国际通用 (1.23K, 1.23M, 1.23B, 1.23T)
 * - cn: 中文千进制 (1.23千, 1.23百万, 1.23十亿, 1.23万亿)
 * - wan: 万进制 (1.23万, 1.23亿, 1.23万亿)
 * - storage: 存储单位 (1KB, 1MB, 1GB, 1TB - 1024进制)
 * - indian: 印度格式 (1.23K, 1.23L, 1.23Cr - 阶梯[1000,100,100])
 */
export type CompactPresetName = 'en' | 'cn' | 'wan' | 'storage' | 'indian';

/**
 * 千分位预设配置类型
 */
export interface ThousandsPreset {
    /** 千分位分隔符，默认 ',' */
    sep?: string;
    /** 小数点符号，默认 '.' */
    point?: string;
    /** 分组规则，默认 [3] */
    grouping?: number[];
    /** 最小触发位数，0 表示不限制 */
    min_len?: number;
    /** 是否对小数部分分组 */
    point_group?: boolean;
    /** 自定义格式化函数 */
    fn?: (num_str: string, context: { int_part: string; dec_part: string | null; sign: string; options: any }) => string;
}

/**
 * 紧凑格式预设配置类型
 */
export type CompactPreset =
    | string[]  // 简写形式：只有符号数组，step 默认 1000
    | {         // 完整形式：包含 symbols 和 step
        symbols: string[];
        step?: number | number[];
    }
    | ((num_str: string, context: {  // 自定义函数形式
        decimals: number;
        options: any;
        current_unit?: string;
    }) => {
        sign: string;
        number: string;
        unit: string;
        formatted: string;
    } | string);  // 可以返回对象或字符串

/**
 * 全局配置项（只能通过 set_config 设置）
 */
export interface GlobalConfig {
    /** 计算模式: "decimal" | "bigint" | "wasm" */
    _compute_mode?: ComputeMode;
    /** 角度单位: "deg" (度) | "rad" (弧度)，默认 "deg" */
    _angle_unit?: AngleUnit;
    /** 除法精度（小数位数），默认 20 */
    _div_precision?: number;
    /** 错误时的返回值，默认 '-' */
    _error?: any;
    /** 是否启用调试模式控制台输出，默认 true */
    _debug_console?: boolean;
    /** 默认舍入模式 */
    _default_round?: string;
    /** 默认格式化字符串（全局配置） */
    _fmt?: string;
    /** 内置函数映射 */
    _builtin_functions?: Record<string, (...args: any[]) => any>;

    // ==================== 紧凑格式配置 ====================
    /** 紧凑格式预设配置（全局配置） */
    _compact?: Record<string, CompactPreset>;
    /** 默认紧凑格式预设名称 */
    _compact_default?: string;

    // ==================== 格式化分组配置 ====================
    /** 格式化分组（全局配置） */
    _fmt_groups?: Record<string, string>;

    // ==================== 单位转换配置 ====================
    /** 单位转换映射（输出单位为key） */
    _unit_convert_out?: UnitConvertOut;
    /** 单位转换映射（输入单位为key，内部会转换为 _unit_convert_out 格式） */
    _unit_convert_in?: UnitConvertIn;
    /** 默认输出单位 */
    _unit_default_out?: string | string[];
    /** 默认输入单位（当有多个输入单位时指定默认从哪个单位转换） */
    _unit_default_in?: string | string[];
    /** 默认单位位置: 'after' | 'before' | 'middle' */
    _unit_default_position?: 'before' | 'after' | 'middle';

    // ==================== 单位联动映射 ====================
    /** 单位到位置的映射 */
    _unit_position_map?: Record<string, 'before' | 'after' | 'middle'>;
    /** 单位到千分位预设的映射 */
    _unit_thousands_map?: Record<string, string>;
    /** 单位到紧凑格式预设的映射 */
    _unit_compact_map?: Record<string, string>;

    // ==================== 千分位配置 ====================
    /** 千分位预设配置 */
    _thousands?: Record<string, ThousandsPreset>;
    /** 默认千分位预设名称 */
    _thousands_default?: string;

    // ==================== 快捷语法配置 ====================
    /** 快捷语法前缀（:xxx 等同于 _shortcut_prefix:xxx），默认 '!u' */
    _shortcut_prefix?: string;

    // ==================== 多路取值配置 ====================
    /** 多路取值时视为空值的值数组（全局配置，运行时选项可覆盖） */
    _empty_values?: any[];
    /** 多路取值时自定义空值判断函数（全局配置，运行时选项可覆盖） */
    _empty_check?: (value: any, path?: string) => boolean;
}

/**
 * 设置全局配置
 * @param config 配置对象
 * @example
 * set_config({ _compute_mode: 'bigint' })  // 切换到 BigInt 模式
 * set_config({ _angle_unit: 'rad' })       // 使用弧度制
 * set_config({ _div_precision: 30 })       // 设置除法精度为 30 位
 * set_config({ _error: 0 })                // 错误时返回 0
 */
export function set_config(config: GlobalConfig): void;

/**
 * 获取全局配置
 * @param key 配置项名称，不传则返回全部配置
 * @returns 配置值或全部配置对象
 * @example
 * get_config('_compute_mode')  // => 'decimal'
 * get_config()                 // => { _compute_mode: 'decimal', ... }
 */
export function get_config(): GlobalConfig;
export function get_config<K extends keyof GlobalConfig>(key: K): GlobalConfig[K];

/**
 * 重置全局配置到默认值
 *
 * @example
 * reset_config()                           // 重置所有配置
 * reset_config('_unit_convert_out')        // 重置单个配置
 * reset_config(['_unit_convert_out', '_unit_default_out'])  // 重置多个配置
 */
export function reset_config(): void;
export function reset_config(key: keyof GlobalConfig): void;
export function reset_config(keys: (keyof GlobalConfig)[]): void;

/**
 * 运算符方法类型（跟随 _compute_mode 配置变化）
 */
export interface Ops {
    // 基础运算
    add: (a: string, b: string) => string;
    sub: (a: string, b: string) => string;
    mul: (a: string, b: string) => string;
    div: (a: string, b: string) => string;
    mod: (a: string, b: string) => string;
    pow: (a: string, b: string) => string;
    idiv: (a: string, b: string) => string;
    // 一元运算
    abs: (a: string) => string;
    neg: (a: string) => string;
    sqrt: (a: string) => string;
    cbrt: (a: string) => string;
    // 指数对数
    exp: (a: string) => string;
    ln: (a: string) => string;
    log: (a: string, base: string) => string;
    log2: (a: string) => string;
    log10: (a: string) => string;
    // 三角函数
    sin: (a: string) => string;
    cos: (a: string) => string;
    tan: (a: string) => string;
    asin: (a: string) => string;
    acos: (a: string) => string;
    atan: (a: string) => string;
    // 双曲函数
    sinh: (a: string) => string;
    cosh: (a: string) => string;
    tanh: (a: string) => string;
    asinh: (a: string) => string;
    acosh: (a: string) => string;
    atanh: (a: string) => string;
    // 取整
    floor: (a: string) => string;
    ceil: (a: string) => string;
    trunc: (a: string) => string;
    round: (a: string) => string;
    // 比较
    max: (a: string, b: string) => string;
    min: (a: string, b: string) => string;
    compare: (a: string, b: string) => number;
    eq: (a: string, b: string) => boolean;
    lt: (a: string, b: string) => boolean;
    gt: (a: string, b: string) => boolean;
    lte: (a: string, b: string) => boolean;
    gte: (a: string, b: string) => boolean;
}

/**
 * 原始运算符对象（跟随 _compute_mode 配置变化）
 */
export const ops: Ops;

/**
 * 加载 WASM 模块（异步）
 * @returns Promise，加载完成后 resolve
 */
export function load_wasm(): Promise<any>;

/**
 * 检查 WASM 模块是否已加载
 * @returns 是否已加载
 */
export function is_wasm_loaded(): boolean;

/**
 * WASM 表达式计算
 * 直接传入复杂表达式字符串，内部完成解析和计算
 * @param expr 表达式字符串
 * @returns 计算结果字符串
 * @example
 * wcalc("1 + 2 * 3")           // => "7"
 * wcalc("sqrt(16) + pow(2, 3)") // => "12"
 */
export function wcalc(expr: string): string;

// ==================== r 前缀原始运算函数 ====================
// 这些函数直接调用底层计算模式，字符串进字符串出，会跟随 _compute_mode 配置变化
// 切换计算模式请使用: set_config({ _compute_mode: 'bigint' })

// 基础运算
export function radd(a: string, b: string): string;
export function rsub(a: string, b: string): string;
export function rmul(a: string, b: string): string;
export function rdiv(a: string, b: string): string;
export function rmod(a: string, b: string): string;
export function rpow(a: string, b: string): string;
export function ridiv(a: string, b: string): string;

// 一元运算
export function rabs(a: string): string;
export function rneg(a: string): string;
export function rsqrt(a: string): string;
export function rcbrt(a: string): string;

// 指数对数
export function rexp(a: string): string;
export function rln(a: string): string;
export function rlog(a: string, base: string): string;
export function rlog2(a: string): string;
export function rlog10(a: string): string;

// 三角函数
export function rsin(a: string): string;
export function rcos(a: string): string;
export function rtan(a: string): string;
export function rasin(a: string): string;
export function racos(a: string): string;
export function ratan(a: string): string;

// 双曲函数
export function rsinh(a: string): string;
export function rcosh(a: string): string;
export function rtanh(a: string): string;
export function rasinh(a: string): string;
export function racosh(a: string): string;
export function ratanh(a: string): string;

// 取整
export function rfloor(a: string): string;
export function rceil(a: string): string;
export function rtrunc(a: string): string;
export function rround(a: string): string;

// 比较
export function rmax(a: string, b: string): string;
export function rmin(a: string, b: string): string;
export function rcompare(a: string, b: string): number;
export function req(a: string, b: string): boolean;
export function rlt(a: string, b: string): boolean;
export function rgt(a: string, b: string): boolean;
export function rlte(a: string, b: string): boolean;
export function rgte(a: string, b: string): boolean;

// ==================== d 前缀原始运算函数（decimal 模式） ====================
// 这些函数始终使用 decimal.js 进行计算，不受 _compute_mode 配置影响

// 基础运算
export function dadd(a: string, b: string): string;
export function dsub(a: string, b: string): string;
export function dmul(a: string, b: string): string;
export function ddiv(a: string, b: string): string;
export function dmod(a: string, b: string): string;
export function dpow(a: string, b: string): string;
export function didiv(a: string, b: string): string;

// 一元运算
export function dabs(a: string): string;
export function dneg(a: string): string;
export function dsqrt(a: string): string;
export function dcbrt(a: string): string;

// 指数对数
export function dexp(a: string): string;
export function dln(a: string): string;
export function dlog(a: string, base: string): string;
export function dlog2(a: string): string;
export function dlog10(a: string): string;

// 三角函数
export function dsin(a: string): string;
export function dcos(a: string): string;
export function dtan(a: string): string;
export function dasin(a: string): string;
export function dacos(a: string): string;
export function datan(a: string): string;

// 双曲函数
export function dsinh(a: string): string;
export function dcosh(a: string): string;
export function dtanh(a: string): string;
export function dasinh(a: string): string;
export function dacosh(a: string): string;
export function datanh(a: string): string;

// 取整
export function dfloor(a: string): string;
export function dceil(a: string): string;
export function dtrunc(a: string): string;
export function dround(a: string): string;

// 比较
export function dmax(a: string, b: string): string;
export function dmin(a: string, b: string): string;
export function dcompare(a: string, b: string): number;
export function deq(a: string, b: string): boolean;
export function dlt(a: string, b: string): boolean;
export function dgt(a: string, b: string): boolean;
export function dlte(a: string, b: string): boolean;
export function dgte(a: string, b: string): boolean;

// ==================== b 前缀原始运算函数（bigint 模式） ====================
// 这些函数始终使用 BigInt 进行计算，不受 _compute_mode 配置影响

// 基础运算
export function badd(a: string, b: string): string;
export function bsub(a: string, b: string): string;
export function bmul(a: string, b: string): string;
export function bdiv(a: string, b: string): string;
export function bmod(a: string, b: string): string;
export function bpow(a: string, b: string): string;
export function bidiv(a: string, b: string): string;

// 一元运算
export function babs(a: string): string;
export function bneg(a: string): string;
export function bsqrt(a: string): string;
export function bcbrt(a: string): string;

// 指数对数
export function bexp(a: string): string;
export function bln(a: string): string;
export function blog(a: string, base: string): string;
export function blog2(a: string): string;
export function blog10(a: string): string;

// 三角函数
export function bsin(a: string): string;
export function bcos(a: string): string;
export function btan(a: string): string;
export function basin(a: string): string;
export function bacos(a: string): string;
export function batan(a: string): string;

// 双曲函数
export function bsinh(a: string): string;
export function bcosh(a: string): string;
export function btanh(a: string): string;
export function basinh(a: string): string;
export function bacosh(a: string): string;
export function batanh(a: string): string;

// 取整
export function bfloor(a: string): string;
export function bceil(a: string): string;
export function btrunc(a: string): string;
export function bround(a: string): string;

// 比较
export function bmax(a: string, b: string): string;
export function bmin(a: string, b: string): string;
export function bcompare(a: string, b: string): number;
export function beq(a: string, b: string): boolean;
export function blt(a: string, b: string): boolean;
export function bgt(a: string, b: string): boolean;
export function blte(a: string, b: string): boolean;
export function bgte(a: string, b: string): boolean;

// ==================== w 前缀原始运算函数（wasm 模式） ====================
// 这些函数使用 WASM 进行计算，首次调用时自动触发 WASM 加载
// 加载完成前使用 decimal 模式兜底

// 基础运算
export function wadd(a: string, b: string): string;
export function wsub(a: string, b: string): string;
export function wmul(a: string, b: string): string;
export function wdiv(a: string, b: string): string;
export function wmod(a: string, b: string): string;
export function wpow(a: string, b: string): string;
export function widiv(a: string, b: string): string;

// 一元运算
export function wabs(a: string): string;
export function wneg(a: string): string;
export function wsqrt(a: string): string;
export function wcbrt(a: string): string;

// 指数对数
export function wexp(a: string): string;
export function wln(a: string): string;
export function wlog(a: string, base: string): string;
export function wlog2(a: string): string;
export function wlog10(a: string): string;

// 三角函数
export function wsin(a: string): string;
export function wcos(a: string): string;
export function wtan(a: string): string;
export function wasin(a: string): string;
export function wacos(a: string): string;
export function watan(a: string): string;

// 双曲函数
export function wsinh(a: string): string;
export function wcosh(a: string): string;
export function wtanh(a: string): string;
export function wasinh(a: string): string;
export function wacosh(a: string): string;
export function watanh(a: string): string;

// 取整
export function wfloor(a: string): string;
export function wceil(a: string): string;
export function wtrunc(a: string): string;
export function wround(a: string): string;

// 比较
export function wmax(a: string, b: string): string;
export function wmin(a: string, b: string): string;
export function wcompare(a: string, b: string): number;
export function weq(a: string, b: string): boolean;
export function wlt(a: string, b: string): boolean;
export function wgt(a: string, b: string): boolean;
export function wlte(a: string, b: string): boolean;
export function wgte(a: string, b: string): boolean;
