import {ElMessage} from "element-plus";
import useClipboard from 'vue-clipboard3';
const { toClipboard } = useClipboard();
/**
 * @description 防抖
 * @param func    功能函数(即要防抖的函数)
 * @param delay   延时时间
 * @param thisArg 功能函数内this的对象
 */
export function debounce(func: Function, delay: number, thisArg?: any) {
    let timer: number;
    return function (...args: any[]) {
        if (timer) {
            window.clearTimeout(timer);
        }
        timer = window.setTimeout(function () {
            func.apply(thisArg, args);
        }, delay)
    }
}
/**
 * @description 节流（原理同上）
 * @param func    功能函数(即要节流的函数)
 * @param delay   延时时间
 * @param thisArg 功能函数内this的对象
 */
export function throttle(func: Function, delay: number, thisArg?: any) {
    let timeStamp: number;
    return function (...args: any[]) {
        const nowTimeStamp = Date.now();
        if ((!timeStamp) || nowTimeStamp - timeStamp >= delay) {
            func.apply(thisArg, args);
            timeStamp = nowTimeStamp;
        }
    }
}
/**
 *  @description vite引入图片
 * @param {string} name   ../assets/images 后面的文件路径+文件名后缀
 * @returns {string} 返回处理后的文件地址
 */
export function getImageUrl(name: string) {
    return new URL(`../assets/images/${name}`, import.meta.url).href;
}
/**
 * 手机号脱敏处理
 * @param  { string} phoneNumber  手机号码
 * @returns {string} 返回处理后的手机号码
 */
export function desensitizationPhone(phoneNumber: string) {
    if (!phoneNumber) return "";
    return phoneNumber.replace(/^(.{3})(\d+)(.{4})$/, "$1****$2")
}
/**
 * 姓名脱敏处理
 * @param {string} name  姓名
 * @returns {string} 返回处理后的姓名
 */
export function desensitizationName(name: string) {
    if (!name) return "";
    const len = name.length;
    return len <= 3 ? "*" + name.substring(1, len) :
        len > 3 && len <= 6 ? "**" + name.substring(2, len) :
            len > 6 ? name.substring(0, 2) + "****" + name.substring(6, len) : "";
}
/**
 * 检查文件类型
 * @param  {string} fileValue  姓名
 * @returns {string} 返回处理后的姓名
 */
export function checkFile(fileValue: string): string {
    let index = fileValue.lastIndexOf('.'); //（考虑严谨用lastIndexOf(".")得到）得到"."在第几位
    let fileValueSuffix = fileValue.substring(index); //截断"."之前的，得到后缀
    if (/(.*)\.(mp4|avi|wmv|MP4|AVI|WMV)$/.test(fileValueSuffix)) {
        //根据后缀，判断是否符合视频格式
        return 'video';
    } else if (/(.*)\.(jpg|JPG|bmp|BMP|mpg|MPG|mpeg|MPEG|tis|TIS|svg|png|jpeg)$/.test(fileValueSuffix)) {
        //根据后缀，判断是否符合图片格式
        return 'image';
    } else if (/(.*)\.(xls|XLS|xlsx|XLSX)$/.test(fileValueSuffix)) {
        //根据后缀，判断是否符合OFFICE格式
        return 'xls';
    } else if (/(.*)\.(doc|DOC|docx|DOCX)$/.test(fileValueSuffix)) {
        // 文档类型
        return 'doc';
    } else if (/(.*)\.(pdf|PDF)$/.test(fileValueSuffix)) {
        // PDF
        return 'pdf';
    } else if (/(.*)\.(PPT|PPTX|ppt|pptx)$/.test(fileValueSuffix)) {
        // ppt
        return 'ppt';
    }
    return 'file';
}
/**
 * 传入类型返回对应的文件类型图标
 * @param  {string} file  文件名
 * @returns {string} 返回处理后的图标
 */
export function fileType(file: string): string {
    switch (file) {
        case 'video':
            return 'ele-VideoCamera';
        case 'image':
            return 'ele-Picture';
        case 'xls':
            return 'iconfont icon-excel';
        case 'doc':
            return 'ele-Document';
        case 'pdf':
            return 'iconfont icon-pdf';
        case 'ppt':
            return 'iconfont icon-ppt';
        default:
            return 'ele-Document';
    }
}
/**
 * @description 阿拉伯数字转大写，整数转大写
 * @returns
 * @param {string | number} num 需要转换的数字
 * @param {string} type
 * @returns {string | number} 返回转换后的数字
 */
export function uppercaseNumber(num: string | number, type:string = ''):number | string {
    if (!num) return 0
    const strNum = Number((num + '').replace(/[,，]*/g, '')) + '' // 记录字符
    num = parseInt(strNum) // 转为整数，
    let capitalAr = '零一二三四五六七八九十'
    let unitAr = ['十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千']
    if (type) {
        capitalAr = '零壹贰叁肆伍陆柒捌玖拾'
        unitAr = ['拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'] // 单位
    }
    const resultAr = <EmptyArrayType>[] // 记录结果，后边json.in就可
    let index = strNum.length - 1 //记录位数
    let idx = 0 // 记录单位
    let percent = 10
    const turnNum = (num: number, percent: number, index: number) => {
        const unit = num / percent
        const capital = capitalAr[Number(strNum[index])]
        if (unit < 1) {
            resultAr.push(capital)
            // 出现11【一十一】这种情况
            if (Number(strNum[index]) === 1 && (strNum.length === 2 || strNum.length === 6 || strNum.length === 10)) {
                resultAr.pop()
            }
            return false //结束递归
        } else {
            if (capital === '零') {
                // 万和亿单位不删除
                if (!['万', '亿'].includes(resultAr[resultAr.length - 1])) {
                    resultAr.pop()
                }
                // 前面有零在删掉一个零
                if (resultAr[resultAr.length - 1] === '零') {
                    resultAr.pop()
                }
            }
            resultAr.push(capital)
            // 过滤存在【零万】【零亿】这种情况
            if (['万', '亿'].includes(resultAr[resultAr.length - 2]) && capital === '零') {
                resultAr.pop()
            }
            // 过滤【1亿万】这种情况
            if (resultAr[0] === '万' && resultAr[1] === '亿') {
                resultAr.shift()
            }
            // 末尾【零】删掉
            if (resultAr[0] === '零') {
                resultAr.pop()
            }
            resultAr.push(unitAr[idx++])
            turnNum(num, percent * 10, --index)
        }
    }
    turnNum(num, percent, index)
    return resultAr.reverse().join('')
}

/**
 * @description 生成guid
 * @returns {string} 返回guid
 */
export function guid(): string {
    const S4 = (): string => {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }
    return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
/**
 * 根据id排除自己（树形结构选择 修改时用）
 * @param {any} arr 需要排除的数组
 * @param {string} id 当前id
 * @returns {arr} 返回排除后的数组
 */
export function excludeSelfById(arr: Array<any>, id: string) {
    if (!arr) return [];
    return arr.filter((v: any) => {
        if (v.id === id) return false;
        if (v.children && v.children.length) {
            v.children = excludeSelfById(v.children, id);
        }
        return true;
    });
}
/**
 * @description 点击复制文本
 * @param {string} text 需要复制的文本
 */
export const copyText = (text: string) => {
    return new Promise((resolve, reject) => {
        try {
            //复制
            toClipboard(text).then(() => {});
            ElMessage.success('复制成功！');
            resolve(text);
        } catch (e) {
            //复制失败
            ElMessage.error('复制失败！');
            reject(e);
        }
    });
};