/**
 * 全局声明
 */
declare global {
    interface Window {
        _hmt: any;
        wx: any;
    }
}
interface ITrackPv {
    type: 'pv';
    pageURL?: string /** 指定要统计PV的页面URL。此项必选，必须是以”/”（斜杠）开头的相对路径 */;
}
interface ITrackEs {
    type: 'es';
    category: string /** 要监控的目标的类型名称，通常是同一组目标的名字，比如”视频”、”音乐”、”软件”、”游戏”等等。该项必选 */;
    action?: string /** 用户跟目标交互的行为，如”播放”、”暂停”、”下载”等等。该项必选。 */;
    opt_label?: string /** 事件的一些额外信息，通常可以是歌曲的名称、软件的名称、链接的名称等等。该项可选。 */;
    opt_value?: string /** 事件的一些数值信息，比如权重、时长、价格等等，在报表中可以看到其平均值等数据。该项可选。 */;
}
declare class Tools {
    private static instance;
    private constructor();
    static defaultUtils(): Tools;
    /**
     * 获取queryString参数值
     * @param key
     * @param queryString
     * @returns T
     */
    static query<T = any>(key?: string | null, queryString?: string): T;
    /**
     * 将对象转换为query参数
     * eg. {name: 'muzili', age: 30} --> ?name=muzili&age=30
     * @param obj
     * @param hasPrefix 是否需要添加 `?` 前缀，默认true
     */
    static convertToQueryWith(obj: Record<string, string | number | boolean>, hasPrefix?: boolean): string;
    /**
     * 将对象转为formData格式
     * @param object
     * @returns
     */
    static convertToFormDataWith(object: Record<string, any>): FormData;
    /**
     * 处理日期格式
     * @param v  时间戳 / 日期字符串 / 日期对象
     * @param format 格式 YYYY-MM-DD HH:mm:ss dddd
     */
    static dateFormat(v: number | string | Date, format?: string): string;
    /**
     * 删除数组中的指定元素
     * @param arr
     * @param key
     * @param value
     */
    static del<T>(arr: T[], key: keyof T, value: any): T[];
    /**
     * 对象数组根据指定key去重
     * @param arr
     * @param key
     * @returns
     */
    static unique<T extends object>(arr: T[], key: keyof T): T[];
    /**
     * 手机号码格式
     * 对于参数格式，手机号固定长度为11位，程序将其分为三部分，如对于手机号：188 1234 5678，其中：
     * $1 -> 188；$2 -> 1234；$3 -> 5678
     * 如果format字段填写的格式为：'$1 **** $3'，则返回数据为：188 **** 5678
     * 这样封装的目的在于手机号的格式可以自由组合，更加灵活。
     * @param phone 手机号
     * @param format 格式字符串 如：'$1 $2 $3'，默认值：$1 **** $2
     */
    static phoneFormatter(phone: string, format?: string): string;
    /**
     * px转vw
     * @param pixel
     */
    static px2vw(pixel: number): string;
    /**
     * 剪贴板
     * @param value 复制内容
     * @returns Promise
     */
    static clipboard(value: string): Promise<unknown>;
    /**
     * 时间倒计时
     * @param options 配置项
     * @param options.timeStamp 剩余时间戳，单位秒
     * @param options.mode      倒计时模式 default/标准时间，seconds/秒，为 seconds 时，超过 60s 不会转成分，小于 10 时不添加前置位“0”
     * @param options.type      倒计时类型 default/秒制；ms/毫秒制
     * @param options.format    返回格式 dd hh:mm:ss，不传则返回元组类型[天,时,分,秒,毫秒]
     * @param options.showDay   是否显示天 true-超过24小时天数+1；false-超过24小时累计小时值，默认为true
     * @param options.pending   倒计时持续状态
     * @param options.complete  倒计时结束
     * @returns
     */
    static timeDown(options: {
        timeStamp: number;
        mode?: 'default' | 'seconds';
        type?: 'default' | 'ms';
        format?: string;
        showDay?: boolean;
        pending: (time: string | string[]) => void;
        complete: () => void;
    }): () => void;
    /**
     * 获取数据类型
     * @param target
     */
    static toRawType(target: any): string;
    /**
     * 百度统计
     * @param options
     */
    static track(options: ITrackPv | ITrackEs): void;
    /**
     * 随机字符
     * @param length
     * @param type
     */
    static randomCharacters(length: number, type?: 'default' | 'uppercase' | 'lowercase' | 'digital'): string;
    /**
     * 获取指定范围内的随机数
     * @param min
     * @param max
     */
    static randomDecimals(min: number, max: number): number;
    /**
     * 获取指定范围内的随机整数
     * @param min
     * @param max
     */
    static randomInteger(min: number, max: number): number;
    /**
     * 全屏
     */
    static launchFullscreen(): void;
    /**
     * 退出全屏
     */
    static exitFullscreen(): void;
    /**
     * 获取年份集合
     * @param start 开始年/默认值：1970
     * @param end 结束年/默认值：当前年
     * @returns
     */
    static getYears(start?: number, end?: number): string[];
    /**
     * 获取月份集合：[1-12]
     * @returns
     */
    static getMonths(): string[];
    /**
     * 获取某月的天数集合
     * @param options 可选项/如果赋值，则表示获取精确天数，默认为31天即[1-31]
     * @returns
     */
    static getDays(options?: {
        year: number;
        month: number;
    }): string[];
    /**
     * 批量下载（导出）文件
     *
     * 使用 blob 流式下载时，需要注意以下几点：
     * 1. 处理跨域问题：如果服务器没有设置合适的CORS策略，可能会阻止JavaScript访问文件。因此，需要确保服务器允许跨域请求。
     * 2. 处理文件格式问题：不同的浏览器可能对不同的文件格式支持程度不同。因此，需要确保服务器提供的文件格式兼容各种浏览器，即指定 Content-Type。
     *    当服务器不知道文件的确切 MIME 类型时，会使用 binary/octet-stream 作为默认值，导致浏览器会将这种 MIME 类型的数据作为二进制文件进行处理，通常会提示用户下载该文件。
     * 3. 部分浏览器无法下载：可能是因为浏览器会发送两次请求，第一次，HEAD 请求，判断文件是否存在，第二次，发送 GET 请求，下载文件。因此安全规则需要加入 HEAD 请求和 GET 请求。
     *
     * @param resources  资源数组，Array<{ source: string | Blob; filename?: string }>
     * @param mode 下载类型：link｜blob，默认值 blob
     * @returns
     */
    static downloadFiles(resources: Array<{
        source: string | Blob;
        filename?: string;
    }>, mode?: 'link' | 'blob'): Promise<void>;
    /**
     * 处理数字小于10时的格式/在小于10的数字前面拼接0
     * @param num
     * @returns
     */
    static numFormat(num: number): string;
    /**
     * 获取当前运行环境
     * @returns
     * - android：安卓环境
     * - ios：iOS环境
     * - weixin：微信环境
     * - alipay：支付宝环境
     * - unknown：未知环境
     */
    static getEnv(): "weixin" | "alipay" | "android" | "ios" | "unknown";
    /**
     * 获取文件存储路径
     * 一般用于规范对象存储时的文件管理规范
     * 生成格式如下：存储目录名/日期/随机字符（3个）+时间戳_图片本身名字.后缀名
     * 示例：admin/avatar/20210630/ULK1625036350104_logo.png
     * @param file
     * @param dirName
     * @returns
     */
    static getFilePath(file: File, dirName: string): string;
    /**
     * 将 Base64 字符串转换为 Uint8Array
     * @param {string} base64String - Base64 字符串
     * @returns {Uint8Array} - 转换后的 Uint8Array
     */
    static base64ToUint8Array(base64String: string): Uint8Array;
    /**
     * 将给定的目标（URL、文件对象或 Blob 对象）转换为 Base64 编码的字符串。
     *
     * 该函数处理以下情况：
     * - 指向图像的 URL，获取图像并将其转换为 Base64。
     * - 文件对象，直接将其转换为 Base64。
     * - Blob 对象，直接将其转换为 Base64。
     *
     * @param  target - 要转换为 Base64 的目标。
     * @returns 一个 Promise 对象，解析为 Base64 编码的字符串，
     * @throws 如果目标不是有效的 URL、文件或 Blob，则抛出错误。
     *
     */
    static base64(target: string | File | Blob): Promise<string>;
    /**
     * 动态加载script标签
     * @param src {string | string[]} 加载脚本的地址，
     * @param type {string} 默认值：text/javascript
     * @returns
     */
    static loadScript(src: string | string[], type?: string): Promise<boolean>;
    /**
     * 深拷贝
     * @param source 源数据
     * @returns
     */
    static deepClone<T = any>(source: T): T;
    /**
     * 更新对象，支持namePath形式
     * 如果你需要深拷贝更新，请试用Tools.deepUpdate
     * @param source  原始对象
     * @param namePath eg: 'user' or 'user.name'
     * @param value   更新值
     */
    static update<T = Record<string, any>>(source: T, namePath: string, value: any): T;
    /**
     * 深拷贝更新对象值
     * @param source  原始对象
     * @param namePath eg: 'user' or 'user.name'
     * @param value   更新值
     * @returns
     */
    static deepUpdate<T = Record<string, any>>(source: T, namePath: string, value: any): T;
    /**
     * 获取上一天
     * @returns 返回日期对象
     */
    static getLastDay(): Date;
    /**
     * 获取上一月
     * @returns 返回日期对象
     */
    static getLastMonth(): Date;
    /**
     * 函数防抖
     * @param cb  回调函数
     * @param delay 延迟时间，默认500ms
     * @returns
     */
    static debounce(cb: (...args: any) => void, delay?: number): (...args: any) => void;
    /**
     * 输入日期查询星座
     * @param $1 日期/数值类型，为数值类型是，$1表示月份(1-12)
     * @param $2 数值类型 日期（天）(1-31)
     * @returns 如果匹配，则返回对应星座，否则返回空字符串（''）
     */
    static getConstellation($1: number | Date, $2?: number): string;
    /**
     * Canvas - 绘制多行文本
     * @param context canvas 上下文
     * @param text 绘制文本
     * @param x 文本左上角x坐标
     * @param y 文本左上角y坐标
     * @param lineHeight 一行所占的高度（行高）
     * @param maxWidth 一行所占的最大宽度，用于计算判断遍历fill文本时是否应该换行，默认为canvas宽度
     * @param maxRows 最多行（默认最多显示5行）
     * @returns 返回所占高度（用于动态绘制后续元素）
     */
    static canvasFillText(context: CanvasRenderingContext2D, text: string, x: number, y: number, lineHeight: number, maxWidth?: number, rows?: number): number;
    /**
     * 文本溢出省略处理
     * @param str  源字符串
     * @param len  长度 / 规则，指定前后保留的位数，默认为6
     * @param type 省略类型: 'head' | 'center' | 'tail'
     * @returns
     */
    static ellipsis(str: string, len?: number, type?: 'head' | 'middle' | 'tail'): string;
    /**
     * 解析日期字符串
     * 一般用于根据年月筛选时，将日期字符串返回起始传递给后端（严格上来讲后端处理即可）
     * 如：2022-02，返回 {start: '202-02-01 00:00:00', end: '202-02-28 23:59:59'}
     * @param dateString 日期字符串，格式：YYYY-MM
     * @returns
     */
    static analysisDateString(dateString: string): {
        start: undefined;
        end: undefined;
    } | {
        start: string;
        end: string;
    };
    /**
     * 打乱数组的顺序
     * @param array - 需要打乱顺序的数组
     * @returns 打乱顺序后的数组
     */
    static shuffleArray<T = any>(array: T[]): T[];
    /**
     * 线程休眠
     * @param delay
     * @returns
     */
    static sleep(delay?: number): Promise<unknown>;
}
export default Tools;
