/**
 * 防抖
 *
 * @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)
    }
}
/**
 * 节流（原理同上）
 *
 * @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;
        }
    }
}
/**
 * vite引入图片
 *
 * @param {string} name   ../assets/images 后面的文件路径+文件名后缀
 */
export function getImageUrl(name: string) {
    return new URL(`../assets/images/${name}`, import.meta.url).href;
}
/**
 * 手机号脱敏处理
 * @param  { string} phoneNumber  手机号码
 * @returns 返回处理后的手机号码
 */
export function desensitizationPhone(phoneNumber: string) {
    if (!phoneNumber) return "";
    return phoneNumber.replace(/^(.{3})(\d+)(.{4})$/, "$1****$2")
}
/**
 * 姓名脱敏处理
 * @param {string} name  姓名
 * @returns 返回处理后的姓名
 */
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 返回处理后的姓名
 */
export function checkFile(fileValue: 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';
}
// 传入类型返回对应的文件类型图标
export function fileType(file: 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';
    }
}
/**
 * 常用意见
 * @param  {string} Discriminate  甄别惯用语
 * @param  {string} Return  退回惯用语
 * @param  {string} Archive  归档惯用语
 * @param  {string} Teti  特提惯用语
 * @param  {string} Seat  坐席惯用语
 * @param  {string} OrderCirculation  工单流转惯用语
 * @param  {string} ReturnVisit  回访惯用语
 * @param  {string} HandleAgain  办理惯用语
 * @param  {string} Delay  延期惯用语
 * @param  {string} Supervise  督办惯用语
 * @param  {string} KnowledgeLocution  知识诉求惯用语
 */
export const commonEnum = {
    Discriminate: 'Discriminate', //  甄别惯用语
    Return: 'Return', // 退回惯用语
    Archive: 'Archive', // 归档惯用语
    Teti: 'Teti', // 特提惯用语
    Seat: 'Seat', // 坐席惯用语
    OrderCirculation: 'OrderCirculation', // 工单流转惯用语
    ReturnVisit: 'ReturnVisit', // 回访惯用语
    HandleAgain: 'HandleAgain', // 办理惯用语
    Delay: 'Delay', // 延期惯用语
    Supervise: 'Supervise', // 督办惯用语
    KnowledgeLocution: 'KnowledgeLocution', // 知识诉求惯用语
    RestReason: 'RestReason', // 小休原因
    Rest: 'Rest', // 小休常用意见
};
/**
 * //阿拉伯数字转大写，整数转大写
 * @returns
 * @param {string | number} num
 * @param {string} type
 * @returns {string | number}
 */
export function upNumber(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('')
}
function S4(): string {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
export function guid(): string {
    return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}

/**
 * 根据id排除自己（树形结构选择 修改时用）
 * @param {any} arr 需要排除的数组
 * @param {string} id
 * @returns {any}
 */
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;
    });
}
/**
 * 常用时间选择
 * @param
 */
export const shortcuts = [
    {
        text: '近一周',
        value: () => {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            return [start, end];
        },
    },
    {
        text: '近一个月',
        value: () => {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
            return [start, end];
        },
    },
    {
        text: '上季度',
        value: () => {
            let oDate = new Date();
            let thisYear = oDate.getFullYear();
            let thisMonth = oDate.getMonth() + 1;
            let n = Math.ceil(thisMonth / 3); // 季度
            let Month = n * 3 - 1;
            let start = new Date(thisYear, Month - 2, 1);
            let end = new Date();
            return [start, end];
        },
    },
    {
        text: '本季度',
        value: () => {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
            return [start, end];
        },
    },
    {
        text: '去年',
        value: ()=> {
            let oDate = new Date();
            let prevYear = oDate.getFullYear() - 1;
            const end = new Date();
            const start = new Date();
            start.setFullYear(prevYear);
            start.setMonth(0);
            start.setDate(1);
            end.setFullYear(prevYear);
            end.setMonth(11);
            end.setDate(31);
            return [start, end];
        }
    },{
        text: '今年',
        value: ()=> {
            const end = new Date();
            const start = new Date();
            start.setMonth(0);
            start.setDate(1);
            return [start, end];
        }
    },
];