export { TreeList } from '../types/index.js';
import * as vue from 'vue';
import { Component } from 'vue';
export { divide, minus, plus, round, strip, times } from 'number-precision';

declare function arrToTree(list: any[], parentMark: string, childrenMark: string): any;
interface TreeList {
    parentId: string | null;
    id: string;
    children?: TreeList[];
}
/**
 * 数组转树结构（多级）
 * 根据parentId===id进行判断
 */
declare function tranListToTreeData<T extends TreeList>(list: T[]): T[];
/**
 * 树结构添加属性,返回新数组。
 */
declare function addPropertyToTree<T extends {
    id: string;
    children?: T[];
    [key: string]: any;
}>(list: T[], formatValue: (cn: T, pn?: T) => any, parentNode?: T): T[];
/**
* 树结构删除一个或者多个元素,返回新数组。
*/
declare function removeElementsWithDescendants<T extends {
    id: string;
    children?: T[];
    [key: string]: any;
}>(list: T[], predicate: (item: T) => boolean): T[];
/**
 * 树结构查询单个元素
 */
declare function findTree<T extends {
    id: string;
    children?: T[];
}>(id: string, list: T[], idName?: any): any;
/**
* 树结构查找多个元素。
*/
declare function findNodesByIds<T extends {
    id: string;
    children?: T[];
    [key: string]: any;
}>(tree: T[], ids: string[], findName?: string, foundNodes?: T[]): T[];

/**
 * @description 计算两个数字的百分百比
 * @param {Number} complete 分子
 * @param {Number} need 分母
 * @return {Number} complete / need
 */
declare const formatPercentage: (complete: number, need: number) => number;
/**
 * @description 计算数组之和
 * @param {Number[]} number[]
 * @return {Number}
 */
declare const arraySum: (arr: number[]) => number;
/**
 * @description 计算数组某个字段之和
 * @param {object[]} object[]
 * @return {Number}
 */
declare const arraySumByKey: (arr: any[], key: string) => number;
/**
 * @description 对比两个数组某个字段之和是否相同
 * @param {object[]} object1[]
 * @param {object[]} object2[]
 * @return {Number}
 */
declare const isArraySumCompared: (arr1: any[], arr2: any[], key1: string, key2?: string) => boolean;
/**
 * @description 格式化数字，增加千分位标记和保留小数
 * @param {Number} num
 * @param {Number} suffix 默认保留两位小数
 * @return {String}
 */
declare const numFormat: (num: number, suffix?: number) => string;

/**
 * 检查对象是否为普通对象（使用“{}”或“new Object”创建）
 * */
declare function isPlainObject(obj: object): boolean;
/**
 * 是否是一个对象
 * */
declare const isObject: (val: unknown) => val is Record<any, any>;
/**
 * 是否是一个时间对象
 * */
declare function isDate(val: any): boolean;
/**
 * 是否是一个URLSearchParams
 * */
declare function isURLSearchParams(val: any): boolean;

declare const assign: {
    <T extends {}, U>(target: T, source: U): T & U;
    <T_1 extends {}, U_1, V>(target: T_1, source1: U_1, source2: V): T_1 & U_1 & V;
    <T_2 extends {}, U_2, V_1, W>(target: T_2, source1: U_2, source2: V_1, source3: W): T_2 & U_2 & V_1 & W;
    (target: object, ...sources: any[]): any;
};

declare function filterOptionHeadle(key: string): (input: string, option: any) => any;

declare function buildURL(url: string, params: any): string;

declare function apiConfiger(config: any): any;

declare type HostKey = "BASE_URL" | "MRP_URL" | "MRP2_URL" | "ASSET_URL" | "ASSETS_URL" | "GATEWAY_URL" | "SFM_URL" | "CCFLOW_URL" | "SHARECOOL_URL" | "PDM_URL";
declare function hostConfiger(key: HostKey): string;

declare type formatType = {
    date: string;
    time: string;
    week: string;
};
/**
 * 函数重载，根据不同参数返回不同类型
 */
declare function dateFormat(): formatType;
declare function dateFormat(data: Date | string, format: string): string;
declare function yearMonthFormat(data?: Date): string | formatType;
declare function yearMonthDayFormat(data?: Date): string | formatType;

declare function onChangeTail(item: any[]): (key: string, cb?: Function) => number;

interface MenuItem {
    label: string;
    onClick: () => void;
    hidden?: boolean;
}
declare function useContextMenu(component: Component): {
    showMenu: (event: MouseEvent, menuItems: MenuItem[]) => void;
    ContextMenuWrapper: vue.DefineComponent<{}, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{}>>, {}, {}>;
};

declare enum ProjectStausEnum {
    "待开工" = 0,
    "在建" = 1,
    "完工未结算" = 2,
    "完工已结算" = 4,
    "已销项" = 8
}

declare enum SignStatusEnum {
    "待签约" = 1,
    "已签约" = 2,
    "已完结" = 4,
    "诉讼中" = 8
}

declare enum LineIDEnum {
    "tx01" = 1,
    "tx02" = 2,
    "tx03" = 4,
    "tx04" = 8,
    "tx05" = 16
}

/**
 * @description 将金额转换为大写，最大九位数。不足用¥填充
 * @param amount
 * */
declare function getAmountByUnit(amount: number): string;
/**
 * @description 将金额保留两位小数。如果包含元字，处理结果也会返回元
 * @param amount
 * */
declare const amountToFixed: (_v?: number | string) => string | 0;
/**
 * @description 将金额加千分符并保留两位小数。如果包含元字，处理结果也会返回元
 * @param amount
 * */
declare const amountToThousandthFixed: (num?: number | string, fixed?: number) => string | 0;

/**
 * btoa: 将字符串进行  Base64 编码。
 * atob: 将 Base64 编码的数据解码为原始字符串。
 * 这些函数只能处理 UTF-8 兼容的字符，如果是非 ASCII 字符，需要先进行 UTF-8 编码.
 *
*/
declare function encryptionStr(data: string | null | undefined): string | null | undefined;
declare function decryptionStr(encodedData: string | null | undefined): string | null | undefined;
/**
 * 正则匹配规则：
 * (\d{3}) 捕获前三位不变。
 * \d{4} 匹配中间的四位数字并将其替换为 ****。
 * (\d{4,}) 匹配最后的四位或更多位数（如 0980 或 0980000）。
*/
declare function maskPhoneNumber(phoneNumber: string): string;
declare function maskIDCard(idCard: string): string;
declare function maskBankCard(bankCard: string): string;

export { LineIDEnum, ProjectStausEnum, SignStatusEnum, addPropertyToTree, amountToFixed, amountToThousandthFixed, apiConfiger, arrToTree, arraySum, arraySumByKey, assign, buildURL as buildUrl, dateFormat, decryptionStr, encryptionStr, filterOptionHeadle, findNodesByIds, findTree, formatPercentage, formatType, getAmountByUnit, hostConfiger, isArraySumCompared, isDate, isObject, isPlainObject, isURLSearchParams, maskBankCard, maskIDCard, maskPhoneNumber, numFormat, onChangeTail, removeElementsWithDescendants, tranListToTreeData, useContextMenu, yearMonthDayFormat, yearMonthFormat };
