import axios from "axios";
import { defineAsyncComponent, nextTick } from 'vue';
import router from "@/router";
/**
 * @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/img/${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)
		: '';
}
/**
 * @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 src 文件地址
 * @param filename 文件名
 */
export function downloadFile(src: string, filename: string) {
	if(!src) {
		return
	}
	let fileName: string = filename || '' // 文件名
	axios({
		method: 'get',
		url: src,
		responseType: 'blob',
		headers: { 'content-type': 'audio/mpeg' },
	}).then((res: any) => {
		let blob:Blob = new Blob([res.data], { type: res.data.type }) // 创建blob 设置blob文件类型 data 设置为后端返回的文件(例如mp3,jpeg) type:这里设置后端返回的类型 为 mp3
		let down: HTMLAnchorElement = document.createElement('a') // 创建A标签
		let href:string = window.URL.createObjectURL(blob) // 创建下载的链接
		down.href = href // 下载地址
		down.download = fileName // 下载文件名
		document.body.appendChild(down)
		down.click() // 模拟点击A标签
		document.body.removeChild(down) // 下载完成移除元素
		window.URL.revokeObjectURL(href) // 释放blob对象
	}).catch(function (error) {
		console.log(error)
	})
}
/**
 * @description 数组排序
 * @param arr 需要排序的数组
 * @param  key 排序的key
 * @param type 排序类型 默认降序 descending  升序 ascending
 * @returns {arr} 返回排序后的数组
 */
export function arraySortByKey(arr: Array<any>, key: string, type= 'descending') {
	return arr.sort((a: any, b: any) => {
		if (type === 'descending') { // 降序
			return b[key] - a[key];
		} else { // 升序
			return a[key] - b[key];
		}
	});
}

/**
 * @description 设置浏览器标题
 * @method const title = useTitle(); ==> title()
 */
export function useTitle() {
	nextTick(() => {
		let webTitle: string;
		const {  meta } = router.currentRoute.value;
		webTitle = <any>meta.title || '宜宾市12345政务热线';
		document.title = `${webTitle}`
	}).then(() => {});
}