import { saveAs } from 'file-saver'
import { getToken } from '../api/auth'
import {apiGetExportMsg} from '../api/api'

//检查空
const checkNull = val => val === undefined || val === null

const until = {
    //搜索栏兼容125%
    collectSeachSty() {
        let winPix = window.devicePixelRatio
        let innerWidth = window.innerWidth
        if (winPix === 1.25 || innerWidth < 1800) {
            return 'padding: 15px 20px 15px 0;'
        }
    },
    //按钮栏兼容125%
    PeriodBtnSty() {
        let winPix = window.devicePixelRatio
        let innerWidth = window.innerWidth
        if (winPix === 1.25 || innerWidth < 1800) {
            return 'padding: 10px 0;'
        }
    },
    getNYRTime(date){
        var y = date.getFullYear();  
        var m = date.getMonth() + 1;  
        m = m < 10 ? ('0' + m) : m;  
        var d = date.getDate();  
        d = d < 10 ? ('0' + d) : d;
        return y + '-' + m + '-' + d
    },
    getAllTime(date){
        var y = date.getFullYear();  
        var m = date.getMonth() + 1;  
        m = m < 10 ? ('0' + m) : m;  
        var d = date.getDate();  
        d = d < 10 ? ('0' + d) : d;  
        var h = date.getHours();  
        h=h < 10 ? ('0' + h) : h;  
        var minute = date.getMinutes();  
        minute = minute < 10 ? ('0' + minute) : minute;  
        var second=date.getSeconds();  
        second=second < 10 ? ('0' + second) : second;  
        return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second; 
    },
    //后端导出
    downloadPer(url,fileName, idss, idsmo) {
        let params = {}
        // if (!idsmo) {
        //     params = {
        //         ids: idss ? idss.join(',') : ''
        //     }
        // } else {
        //     params = {
        //         idsMv: idss ? idss.join(',') : '',
        //         idsBcr: idsmo ? idsmo.join(',') : '',
        //     }
        // }
        apiGetExportMsg(url,params).then(datas =>{
            let blob = new Blob([datas])
            saveAs(blob, fileName)
        }).catch((r) => {
            console.error(r)
        })
    },
    // 权限分配
    havePurview(data) {
        let show = false
        if (window.localStorage.getItem('purview')) {
            let per = JSON.parse(window.localStorage.getItem('purview'))
            per.forEach(it => {
                if (it === data) { 
                    show = true
                }
            })
        }
        return show
    },
    
    sortBy(attr,rev){
        //第二个参数没有传递 默认升序排列
        if(rev ==  undefined){
            rev = 1;
        }else{
            rev = (rev) ? 1 : -1;
        }
        return function(a,b){
            a = a[attr];
            b = b[attr];
            if(a < b){
                return rev * -1;
            }
            if(a > b){
                return rev * 1;
            }
            return 0;
        }
    },
    /**
 * 字母大小写切换
 * @param str 要处理的字符串
 * @param type 1:首字母大写其余小写 2：首子母小写其余大写 3：大小写转换 4：全部大写 5：全部小写
 */
    strChangeCase(str, type) {
        function ToggleCase(str) {
            var itemText = ""
            str.split("").forEach(
                function (item) {
                    if (/^([a-z]+)/.test(item)) {
                        itemText += item.toUpperCase();
                    } else if (/^([A-Z]+)/.test(item)) {
                        itemText += item.toLowerCase();
                    } else {
                        itemText += item;
                    }
                });
            return itemText;
        }

        switch (type) {
            case 1:
                return str.replace(/^(\w)(\w+)/, function (v, v1, v2) {
                    return v1.toUpperCase() + v2.toLowerCase();
                });
            case 2:
                return str.replace(/^(\w)(\w+)/, function (v, v1, v2) {
                    return v1.toLowerCase() + v2.toUpperCase();
                });
            case 3:
                return ToggleCase(str);
            case 4:
                return str.toUpperCase();
            case 5:
                return str.toLowerCase();
            default:
                return str;
        }
    },
    /*
 *数字每千位加逗号
 * 
 */
    commafy(num) {
        return num && num.toString()
        .replace(/\d+/, function(s){
            return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,')
        })
    },

/*
 *手机号码中间4位隐藏花号（*）显示
 *
 */
    hideMobile(mobile) {
        return mobile && mobile.toString().replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
    },
    /*
 * 验证是否为数字
 */
    isNumber(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    },

    /*
    * 是否为数组
    */
    isArray(obj) {
        return Object.prototype.toString.call(obj) === '[object Array]';
    },

    /*
    * 递归深拷贝
    */
    deepCopy(obj) {
        let result = Array.isArray(obj) ? [] : {};
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
            if (typeof obj[key] === 'object' && obj[key] !== null) {
                result[key] = deepCopy(obj[key]);
            } else {
                result[key] = obj[key];
            }
            }
        }
        return result;
    },
    exportTable(name, columnData, tableDatas) {
        let datalist = [];
        //表头数据
        let cluData = ''
        for(let i=0; i<columnData.length;i++){
            cluData += columnData[i].label+','
        }
        cluData.slice(0, cluData.length-1)
        datalist.push(cluData.split(','));
        //这里的tableData为你的表格数据
        for(let j=0;j<tableDatas.length;j++) {
            let item = tableDatas[j]
            let tabelDatas = ''
            for(let k=0; k<columnData.length;k++){
                let its = columnData[k]
                if (item[its.value] !==null) {
                    tabelDatas += item[its.value] + ','
                } else {
                    tabelDatas +=  '-,'
                }
            }
            datalist.push(tabelDatas.split(','));
        }
        downloadXlsx(datalist, `${name}.xlsx`);
        // let blob = new Blob([datalist])
        // saveAs(blob, `${name}.xlsx`)
        // this.exportCsv(datalist)
    },

    exportExcel() {
        // let time = this.$utils.getTime(new Date())
        // let titleName = this.title + ' ' + time
        // this.$utils.exportTable(titleName,this.columData, this.tableData)

        let wb = XLSX.utils.book_new();
        let headers = {
            name: '姓名',
            age: '年龄',
            sex: '性别'
        }
        this.columData.unshift(headers)
        let contentWs = XLSX.utils.json_to_sheet(this.columData, {
            header: ['name', 'age', 'sex'], // 可自定义表头顺序
            skipHeader: true, //是否忽略表头，默认为false
            origin: 'A2' // 设置插入位置
        })
        contentWs['!merges'] = [{s:{r:0,c:0}, e:{r:1,c:0}}, {s:{r:0,c:1}, e:{r:1,c:1}}]
        // contentWs['!merges'] = [{s:{r:1,c:2}, e:{r:2,c:2}}]
        // contentWs['A1'] = {
        //     t: 's',
        //     v: '人员',
        //     s: {
        //         font:{
        //             name: '微软雅黑',
        //             sz: 16,
        //             bold: true,
        //             color: {rgb: 'ffffff'}
        //         },
        //         alignment: {
        //             horizontal: 'center',
        //             vertical: 'center'
        //         },
        //         fill:{bgcolor: {rgb: '4472c4'}}
        //     }
        // }
        // 设置合并单元格 ！merges为一个对象数组，每个对象设定了单元格合并的规则，
        // {s:{r:0,c:0}, e:{r:0,c:2}}为一个规则，s:起始位置，e：结束位置，r：行，c：列
        // contentWs['!merges'] = [{s:{r:0,c:0}, e:{r:0,c:2}}]

        
        // contentWs['A3'] = {
        //     t: 's',
        //     v: '人员ss',
        //     s: {
        //         font:{
        //             name: '微软雅黑',
        //             sz: 16,
        //             bold: true,
        //             color: {rgb: 'ffffff'}
        //         },
        //         alignment: {
        //             horizontal: 'center',
        //             vertical: 'center'
        //         },
        //         fill:{bgcolor: {rgb: '4472c4'}}
        //     }
        // }
        // contentWs['!merges'] = [{s:{r:0,c:2}, e:{r:0,c:4}}]
        //设置列宽
        contentWs['!cols'] = [{wch: 30},{wch: 20},{wch: 40}]
        XLSX.utils.book_append_sheet(wb, contentWs, '明细')
        // XLSX.writeFile(wb, '明细.xlsx')
        const tmpDown = new Blob([
            this.s2ab(
                XLSXD.write(wb, {
                    bookType: 'xlsx',
                    bookSST: true,
                    type: 'binary',
                    cellStyles: true
                })
            )
        ])
        this.downExcel(tmpDown, '明细.xlsx')
    },
    downExcel(obj, fileName) {
        const a_node = document.createElement('a')
        a_node.download = fileName
        if ('msSaveOrOpenBlob'in navigator) {
            window.navigator.msSaveOrOpenBlob(obj, fileName)
        } else {
            a_node.href = URL.createObjectURL(obj)
        }
        a_node.click()
        setTimeout(() =>{
            URL.createObjectURL(obj)
        }, 2000)
    },
    s2ab(s) {
        if (typeof ArrayBuffer !== 'undefined') {
            const buf = new ArrayBuffer(s.length)
            const view = new Uint8Array(buf)
            for(let i =0; i != s.length; ++i) {
                view[i] = s.charCodeAt(i) & 0xff
            }
            return buf
        } else {
            const buf = new Array(s.length)
            for(let i =0; i != s.length; ++i) {
                buf[i] = s.charCodeAt(i) & 0xff
            }
            return buf
        }
    },
    setTooltip(myChart1, myChart2, num) {
        // const myChart1 = this.$echarts.init(document.getElementById(name1))
        // const myChart2 = this.$echarts.init(document.getElementById(name2))
        myChart1.getZr().on('mousemove', (params) => {
            const pointInPixel = [params.offsetX, params.offsetY];
            // 判断当前鼠标移动的位置是否在图表中
            if (myChart1.containPixel('grid', pointInPixel)) {
                //使用 convertFromPixel方法 转换像素坐标值到逻辑坐标系上的点。获取点击位置对应的x轴数据的索引值
                const pointInGrid = myChart1.convertFromPixel({ seriesIndex: 0 }, pointInPixel);
                // x轴数据的索引值
                const xIndex = pointInGrid[0];
                // 使用getOption() 获取图表的option
                const op = myChart1.getOption();
                // 获取当前点击位置要的数据
                const xDate = op.xAxis[0].data[xIndex];
                // 这里不直接用params.dataIndex是因为可能两个图表X轴的月份数据点不一致
                const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate);
                myChart2.dispatchAction({
                    type: 'showTip',
                    seriesIndex: num,
                    // 我用的echarts版本是4.8.0，用name而不用dataIndex时，不知道为什么tooltip不显示，所以这里用dataIndex
                    // name: params.name
                    dataIndex: dataIndex,
                    position: '15%'
                });
            } else { 
                myChart2.dispatchAction({
                    type: 'hideTip'
                });
            }
        })
        myChart2.getZr().on('mousemove', (params) => {
            const pointInPixel = [params.offsetX, params.offsetY];
            // 判断当前鼠标移动的位置是否在图表中
            if (myChart2.containPixel('grid', pointInPixel)) {
                //使用 convertFromPixel方法 转换像素坐标值到逻辑坐标系上的点。获取点击位置对应的x轴数据的索引值
                const pointInGrid = myChart2.convertFromPixel({ seriesIndex: 0 }, pointInPixel);
                // x轴数据的索引值
                const xIndex = pointInGrid[0];
                // 使用getOption() 获取图表的option
                const op = myChart2.getOption();
                // 获取当前点击位置要的数据
                const xDate = op.xAxis[0].data[xIndex];
                // 这里不直接用params.dataIndex是因为可能两个图表X轴的月份数据点不一致
                const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate);
                myChart1.dispatchAction({
                    type: 'showTip',
                    seriesIndex: num,
                    // 我用的echarts版本是4.8.0，用name而不用dataIndex时，不知道为什么tooltip不显示，所以这里用dataIndex
                    // name: params.name
                    dataIndex: dataIndex,
                    position: '15%'
                });
            } else { 
                myChart1.dispatchAction({
                    type: 'hideTip'
                });
            }
        })
    },
    // 数据是否为null，NaN，0的判断
    isHasNum(data) {
        let num = null
        if (data && data !== 0) {
            if (data !== 'NaN' && data !== null) {
                num = Number(data).toFixed(2)
            } else {
                num = '-'
            }
        } else if(data === 0) {
            num = 0
        } else {
            num = '-'
        }
        return num
    },
    //获取当前月天数
    hasYearMonthDate(a, b) {
        let d = new Date(a, b, 0)
        let de = d.getDate()
        return de
    },
    // ------------------------------------------------------------------------
    // 冒泡排序
    sortBubble(arr) {
        for(let i=0; i<arr.length; i++){
            for(let j=0; j<arr.length-i; j++){
                if (arr[j] > arr[j+1]) {
                    let temp = arr[j]
                    arr[j] = arr[j+1]
                    arr[j+1] = temp
                }
            }
        }
        return arr
    },
    //数组去重
    // 方法一
    //利用for 循环 搭配 indexOf 去重
    unique(arr) {
        let newArr = []
        for(let i=0; i<arr.length; i++) {
            if (newArr.indexOf(arr[i]) === -1) {
                newArr.push(arr[i])
            }
        }
        return arr
    },
    //方法二
    //借助ES6提供的Set结构 new Set() 
    // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22];
    // var arr2 = noRepeat(arr)
    noRepeatT(arr){
        var newArr = [...new Set(arr)]; //利用了Set结构不能接收重复数据的特点
        return newArr
    },
    //方法三
    //利用 filter() 去重
    //eg: var arr = ['apple','apps','pear','apple','orange','apps']
    useFilter(arr) {
        return arr.filter(function(item,index){
            return arr.indexOf(item) === index;  // 因为indexOf 只能查找到第一个  
        })
    },
    //方法四
    //将数组的每一个元素依次与其他元素做比较，发现重复元素，删除 
    //eg: var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22];
    noRepeatF(arr) {
        for(var i = 0; i < arr.length-1; i++){
            for(var j = i+1; j < arr.length; j++){
                if(arr[i]===arr[j]){
                    arr.splice(j,1);
                    j--;
                }
            }
        }
        return arr;
    },
    //方法五
    //借助新数组 通过 indexOf 方法判断当前元素在数组中的索引，如果与循环的下标相等则添加到新数组中
    // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22]
    noRepeatFi(arr) {
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr.indexOf(arr[i]) == i) {
            newArr.push(arr[i]);
            }
        }
        return newArr;
    },
    //方法六
    //利用双重for循环
    // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22]
    noRepeatS(arr){
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr.length; j++) {
            if (arr[i] == arr[j] && i != j) { //将后面重复的数删掉
                arr.splice(j, 1);
                }
        }
        }
        return arr;
    },
    //方法七
    //利用includes实现数组去重
    // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22];
    noRepeatSe(arr) {
        let newArr = [];
        for(i=0; i<arr.length; i++){
            if(!newArr.includes(arr[i])){
                newArr.push(arr[i])
            }
        }
        return newArr
    },
    //把url中的参数解析为一个对象
    // var url = 'http://www.demo.cn/index.html?key1=val1&key2=val2'
    parseQueryString(argu) {
        let str = argu.split('?')[1]
        let result = {}
        let temp = str.split('&')
        for(let i=0; i<temp.length; i++) {
            let temp2 = temp[i].split('=')
            result[temp2[0]] = temp2[1]
        }
        return result
    },
    //统计字符串中出现最多的字母
    // let str = 'jdjsajdjasdasdakss'
    countStr(str) {
        let json = {}
        //循环完毕后会得到一个对象 如{a:0,b:1,c:2}
        for(let i=0; i<str.length; i++) {
            if (!json[str.charAt(i)]) {
                json[str.charAt(i)] = 1
            } else {
                json[str.charAt(i)]++
            }
        }
    },
    //对象深拷贝
    deepClone(obj) {
        if (obj instanceof Object) {
            let isArray = Array.isArray(obj)
            let cloneObj = isArray ? [] : {}
            for(let key in obj) {
                cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
            }
            return cloneObj
        } else {
            throw new Error('obj不是一个对象')
        }
    },
    // 防抖
    debounce(fn, delay) {
    
        var delay = delay || 200;
        var timer;
        return function () {
            var th = this;
            var args = arguments;
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(function () {
                timer = null;
                fn.apply(th, args);
            }, delay);
        };
    },
    // 节流
    throttle(fn, interval) {
        var last;
        var timer;
        var interval = interval || 200;
        return function () {
            var th = this;
            var args = arguments;
            var now = +new Date();
            if (last && now - last < interval) {
                clearTimeout(timer);
                timer = setTimeout(function () {
                    last = now;
                    fn.apply(th, args);
                }, interval);
            } else {
                last = now;
                fn.apply(th, args);
            }
        }
    }
}
export default until