import { ClassValue } from "clsx";
import dayjs from "dayjs";
import { isFunction, isObject, isString } from "@vue/shared";
import { createDefu as createMerge, defu as merge } from "defu";
import { get, isEqual, set } from "es-toolkit/compat";
import cloneDeep from "lodash.clonedeep";

//#region src/utils/cn.d.ts
declare function cn(...inputs: ClassValue[]): string;
//#endregion
//#region src/utils/date.d.ts
type FormatDate = Date | dayjs.Dayjs | number | string;
type Format = 'HH' | 'HH:mm' | 'HH:mm:ss' | 'YYYY' | 'YYYY-MM' | 'YYYY-MM-DD' | 'YYYY-MM-DD HH' | 'YYYY-MM-DD HH:mm' | 'YYYY-MM-DD HH:mm:ss' | (string & {});
declare function formatDate(time?: FormatDate, format?: Format): string;
declare function formatDateTime(time?: FormatDate): string;
declare function formatDate2(date: Date, format?: string): string;
declare function isDate(value: any): value is Date;
declare function isDayjsObject(value: any): value is dayjs.Dayjs;
declare function dateFormatter(_row: any, _column: any, cellValue: any): string;
declare const getSystemTimezone: () => string;
declare const setCurrentTimezone: (timezone?: string) => void;
declare const getCurrentTimezone: () => string;
declare function formatDayjs(value: dayjs.Dayjs | null | string | undefined): string;
//#endregion
//#region src/utils/diff.d.ts
declare function arraysEqual<T>(a: T[], b: T[]): boolean;
type DiffResult<T> = Partial<{ [K in keyof T]: T[K] extends object ? DiffResult<T[K]> : T[K] }>;
declare function diff<T extends Record<string, any>>(obj1: T, obj2: T): DiffResult<T>;
//#endregion
//#region src/utils/dom.d.ts
interface VisibleDomRect {
  bottom: number;
  height: number;
  left: number;
  right: number;
  top: number;
  width: number;
}
declare function getElementVisibleRect(element?: HTMLElement | null | undefined): VisibleDomRect;
declare function getScrollbarWidth(): number;
declare function needsScrollbar(): boolean;
declare function triggerWindowResize(): void;
//#endregion
//#region src/utils/download.d.ts
interface DownloadOptions<T = string> {
  fileName?: string;
  source: T;
  target?: string;
}
declare function downloadFileFromUrl({
  fileName,
  source,
  target
}: DownloadOptions): Promise<void>;
declare function downloadImageByCanvas({
  url,
  canvasWidth,
  canvasHeight,
  drawWithImageSize
}: {
  canvasHeight?: number;
  canvasWidth?: number;
  drawWithImageSize?: boolean;
  url: string;
}): void;
declare function downloadFileFromBase64({
  fileName,
  source
}: DownloadOptions): void;
declare function downloadFileFromImageUrl({
  fileName,
  source
}: DownloadOptions): Promise<void>;
declare function downloadFileFromBlob({
  fileName,
  source
}: DownloadOptions<Blob>): void;
declare function downloadFileFromBlobPart({
  fileName,
  source
}: DownloadOptions<BlobPart>): void;
declare function dataURLtoBlob(base64Buf: string): Blob;
declare function urlToBase64(url: string, mineType?: string): Promise<string>;
declare function base64ToFile(base64: string, fileName: string): File;
declare function triggerDownload(href: string, fileName: string | undefined, revokeDelay?: number): void;
//#endregion
//#region src/utils/encrypt.d.ts
declare const AES: {
  encrypt(data: string, key: string): string;
  decrypt(encryptedData: string, key: string): string;
};
declare const RSA: {
  encrypt(data: string, publicKey: string): false | string;
  decrypt(encryptedData: string, privateKey: string): false | string;
};
interface ApiEncryptConfig {
  algorithm: 'AES' | 'RSA';
  enable: boolean;
  header: string;
  requestKey: string;
  responseKey: string;
}
declare class ApiEncrypt {
  private config;
  constructor(config: ApiEncryptConfig);
  decryptResponse(encryptedData: string): any;
  encryptRequest(data: any): string;
  getEncryptHeader(): string;
}
declare function createApiEncrypt(env: Record<string, any>): ApiEncrypt;
//#endregion
//#region src/utils/formatNumber.d.ts
declare function formatToFractionDigit(num: number | string | undefined, digit?: number): string;
declare function formatToFraction(num: number | string | undefined): string;
declare function floatToFixed2(num: number | string | undefined): string;
declare function convertToInteger(num: number | string | undefined): number;
declare function yuanToFen(amount: number | string): number;
declare function fenToYuan(price: number | string): string;
declare const fenToYuanFormat: (_: any, __: any, cellValue: any, ___: any) => string;
declare function calculateRelativeRate(value?: number, reference?: number): number;
declare function erpNumberFormatter(num: number | string | undefined, digit: number): string;
declare function erpCountInputFormatter(num: number | string | undefined): string;
declare function erpCountTableColumnFormatter(cellValue: any): string;
declare function erpPriceInputFormatter(num: number | string | undefined): string;
declare function erpPriceTableColumnFormatter(cellValue: any): string;
declare function erpPriceMultiply(price: number, count: number): number | undefined;
declare function erpCalculatePercentage(value: number, total: number): string | 0;
//#endregion
//#region src/utils/inference.d.ts
declare function isUndefined(value?: unknown): value is undefined;
declare function isBoolean(value: unknown): value is boolean;
declare function isEmpty<T = unknown>(value?: T): boolean;
declare function isEmptyVal(value?: unknown): value is '' | null | undefined;
declare function isHttpUrl(url?: string): boolean;
declare function isWindow(value: any): value is Window;
declare function isMacOs(): boolean;
declare function isWindowsOs(): boolean;
declare function isNumber(value: any): value is number;
declare function getFirstNonNullOrUndefined<T>(...values: (null | T | undefined)[]): T | undefined;
//#endregion
//#region src/utils/letter.d.ts
declare function capitalizeFirstLetter(string: string): string;
declare function toLowerCaseFirstLetter(str: string): string;
declare function toCamelCase(key: string, parentKey: string): string;
declare function kebabToCamelCase(str: string): string;
//#endregion
//#region src/utils/merge.d.ts
declare const mergeWithArrayOverride: import("defu").DefuFn;
//#endregion
//#region src/utils/nprogress.d.ts
declare function startProgress(): Promise<void>;
declare function stopProgress(): Promise<void>;
//#endregion
//#region src/utils/resources.d.ts
declare function loadScript(src: string): Promise<void>;
//#endregion
//#region src/utils/stack.d.ts
declare class Stack<T> {
  get size(): number;
  private readonly dedup;
  private items;
  private readonly maxSize?;
  constructor(dedup?: boolean, maxSize?: number);
  clear(): void;
  peek(): T | undefined;
  pop(): T | undefined;
  push(...items: T[]): void;
  remove(...itemList: T[]): void;
  retain(itemList: T[]): void;
  toArray(): T[];
}
declare const createStack: <T>(dedup?: boolean, maxSize?: number) => Stack<T>;
//#endregion
//#region src/utils/state-handler.d.ts
declare class StateHandler {
  private condition;
  private rejectCondition;
  private resolveCondition;
  isConditionTrue(): boolean;
  reset(): void;
  setConditionFalse(): void;
  setConditionTrue(): void;
  waitForCondition(): Promise<void>;
  private clearPromises;
}
//#endregion
//#region src/utils/time.d.ts
declare function formatTime(time: Date | number | string, fmt: string): string;
declare function getWeek(dateTime: Date): number;
declare function formatPast(param: Date | string, format?: string): string;
declare function formatAxis(param: Date): string;
declare function formatPast2(ms: number): string;
declare function beginOfDay(param: Date): Date;
declare function endOfDay(param: Date): Date;
declare function betweenDay(param1: Date, param2: Date): number;
declare function addTime(param1: Date, param2: number): Date;
declare function convertDate(param: Date | string): Date;
declare function isSameDay(a: dayjs.ConfigType, b: dayjs.ConfigType): boolean;
declare function getDayRange(date: dayjs.ConfigType, days: number): [dayjs.ConfigType, dayjs.ConfigType];
declare function getLast7Days(): [dayjs.ConfigType, dayjs.ConfigType];
declare function getLast30Days(): [dayjs.ConfigType, dayjs.ConfigType];
declare function getLast1Year(): [dayjs.ConfigType, dayjs.ConfigType];
declare function getDateRange(beginDate: dayjs.ConfigType, endDate: dayjs.ConfigType): [string, string];
//#endregion
//#region src/utils/to.d.ts
declare function to<T, U = Error>(promise: Readonly<Promise<T>>, errorExt?: object): Promise<[null, T] | [U, undefined]>;
//#endregion
//#region src/utils/tree.d.ts
interface TreeConfigOptions {
  childProps: string;
}
interface TreeNode {
  [key: string]: any;
  children?: TreeNode[];
}
declare function traverseTreeValues<T, V>(tree: T[], getValue: (node: T) => V, options?: TreeConfigOptions): V[];
declare function filterTree<T extends Record<string, any>>(tree: T[], filter: (node: T) => boolean, options?: TreeConfigOptions): T[];
declare function mapTree<T, V extends Record<string, any>>(tree: T[], mapper: (node: T) => V, options?: TreeConfigOptions): V[];
declare function handleTree(data: TreeNode[], id?: string, parentId?: string, children?: string): TreeNode[];
declare function treeToString(tree: any[], nodeId: number | string): any;
declare function sortTree<T extends Record<string, any>>(treeData: T[], sortFunction: (a: T, b: T) => number, options?: TreeConfigOptions): T[];
//#endregion
//#region src/utils/unique.d.ts
declare function uniqueByField<T>(arr: T[], key: keyof T): T[];
//#endregion
//#region src/utils/update-css-variables.d.ts
declare function updateCSSVariables(variables: {
  [key: string]: string;
}, id?: string, selector?: string): void;
//#endregion
//#region src/utils/upload.d.ts
declare function generateAcceptedFileTypes(supportedFileTypes: string[]): string;
declare function getFileNameFromUrl(url: null | string | undefined): string;
declare const defaultImageAccepts: string[];
declare function isImage(filename: null | string | undefined, accepts?: string[]): boolean;
declare function checkFileType(file: File, accepts: string[]): boolean;
declare function formatFileSize(bytes: number, digits?: number): string;
declare function getFileIcon(filename: null | string | undefined): string;
declare function getFileTypeClass(filename: null | string | undefined): string;
//#endregion
//#region src/utils/url.d.ts
declare function isUrl(path: string): boolean;
declare function isOpenableUrl(url?: null | string): boolean;
declare function openSafeUrl(url?: null | string): void;
//#endregion
//#region src/utils/util.d.ts
declare function bindMethods<T extends object>(instance: T): void;
declare function getNestedValue<T>(obj: T, path: string): any;
declare function getUrlNumberValue(key: string, urlStr?: string): number;
declare function getUrlValue(key: string, urlStr?: string): string;
declare function copyValueToTarget(target: any, source: any): void;
declare function groupBy(array: any[], key: string): Record<string, any[]>;
declare function jsonParse(str: string): any;
declare function getStableObjectKey(item: object, generator?: () => string): string;
//#endregion
//#region src/utils/uuid.d.ts
declare function buildUUID(): string;
declare function buildShortUUID(prefix?: string): string;
//#endregion
//#region src/utils/window.d.ts
interface OpenWindowOptions {
  noopener?: boolean;
  noreferrer?: boolean;
  target?: '_blank' | '_parent' | '_self' | '_top' | string;
}
declare function openWindow(url: string, options?: OpenWindowOptions): void;
declare function openRouteInNewWindow(path: string): void;
//#endregion
export { AES, ApiEncrypt, ApiEncryptConfig, RSA, Stack, StateHandler, VisibleDomRect, addTime, arraysEqual, base64ToFile, beginOfDay, betweenDay, bindMethods, buildShortUUID, buildUUID, calculateRelativeRate, capitalizeFirstLetter, checkFileType, cloneDeep, cn, convertDate, convertToInteger, copyValueToTarget, createApiEncrypt, createMerge, createStack, dataURLtoBlob, dateFormatter, defaultImageAccepts, diff, downloadFileFromBase64, downloadFileFromBlob, downloadFileFromBlobPart, downloadFileFromImageUrl, downloadFileFromUrl, downloadImageByCanvas, endOfDay, erpCalculatePercentage, erpCountInputFormatter, erpCountTableColumnFormatter, erpNumberFormatter, erpPriceInputFormatter, erpPriceMultiply, erpPriceTableColumnFormatter, fenToYuan, fenToYuanFormat, filterTree, floatToFixed2, formatAxis, formatDate, formatDate2, formatDateTime, formatDayjs, formatFileSize, formatPast, formatPast2, formatTime, formatToFraction, formatToFractionDigit, generateAcceptedFileTypes, get, getCurrentTimezone, getDateRange, getDayRange, getElementVisibleRect, getFileIcon, getFileNameFromUrl, getFileTypeClass, getFirstNonNullOrUndefined, getLast1Year, getLast30Days, getLast7Days, getNestedValue, getScrollbarWidth, getStableObjectKey, getSystemTimezone, getUrlNumberValue, getUrlValue, getWeek, groupBy, handleTree, isBoolean, isDate, isDayjsObject, isEmpty, isEmptyVal, isEqual, isFunction, isHttpUrl, isImage, isMacOs, isNumber, isObject, isOpenableUrl, isSameDay, isString, isUndefined, isUrl, isWindow, isWindowsOs, jsonParse, kebabToCamelCase, loadScript, mapTree, merge, mergeWithArrayOverride, needsScrollbar, openRouteInNewWindow, openSafeUrl, openWindow, set, setCurrentTimezone, sortTree, startProgress, stopProgress, to, toCamelCase, toLowerCaseFirstLetter, traverseTreeValues, treeToString, triggerDownload, triggerWindowResize, uniqueByField, updateCSSVariables, urlToBase64, yuanToFen };