/**
 * @param {*} val
 * @return {*} 校验只要是数字（包含正负整数，0以及正负浮点数）就返回true
 */
function isNumber(val) {
    var regPos = /^\d+(\.\d+)?$/; //非负浮点数
    var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
    if (regPos.test(val) && regNeg.test(val)) {
        return true;
    }
    return false;
}

/**
 * 节流
 * @param fn 需要节流的函数
 * @param t 时间
 */
const throttle = (ft, t) => {
    let flag = true;
    const interval = t;
    return function (self, ...args) {
        if (flag) {
            fn.apply(self, args);
            flag = false;
            setTimeout(() => {
                flag = true;
            }, interval);
        }
    };
};

/**
 * 防抖
 * @param fn 需要防抖的函数
 * @param t 时间
 */
const debounce = (fn, t = 300) => {
    let timeId = null;
    const delay = t;
    return function (self, ...args) {
        if (timeId) {
            clearTimeout(timeId);
        }
        timeId = setTimeout(() => {
            timeId = null;
            fn.apply(self, args);
        }, delay);
    };
};

// 防抖示例
// addNumber = debounce(function (this: any) {
//   this.setData({
//     number: this.data.number + 10
//   })
// }, 300)
//节流示例
// reduce = throttle(function (this: any) {
//   this.setData({
//     number: this.data.number - 1
//   })
// }, 1000)

/**
 * 获取app.json下的pages
 */
// const { pages } = __wxConfig;

/**
 * 获取当前时间
 * @param {Object} date
 */
function getDateString(date = new Date()) {
    return {
        year: date.getFullYear(),
        month: date.getMonth() + 1,
        day: date.getDate(),
        hour: date.getHours(),
        minute: date.getMinutes()
    };
}

/**
 * 设置树哪一级可选
 *
 * @param {Array} data    需要处理的树
 * @param {Number} level  级别
 * @returns {Array} 处理完成的树
 * @description 可以选择的时候添加 selectable = true,反之, selectable = false
 */
function setSelectTreeLevel(tree, level) {
    if (!Array.isArray(tree)) {
        throw new Error('tree is not array!');
    }
    const list = JSON.parse(JSON.stringify(tree));
    return list.map((item) => {
        const itemObj = item;
        itemObj.selectable = itemObj.code === level;
        if (Array.isArray(itemObj.children) && itemObj.children.length > 0) {
            itemObj.children = setSelectTreeLevel(itemObj.children, level);
        }
        return itemObj;
    });
}

/**
 * chilren为空的时候,从null转换为[]
 *
 * @param {Array} data    需要处理的树
 * @returns {Array} 处理完成的树
 */
function handleChildren(tree) {
    if (!Array.isArray(tree)) {
        throw new Error('tree is not array!');
    }
    const list = JSON.parse(JSON.stringify(tree));
    return list.map((item) => {
        // eslint-disable-next-line no-param-reassign
        if (item.children === null) {
            item.children = [];
        } else {
            handleChildren(item.children);
        }
        return item;
    });
}

/**
 * 格式化时间
 * @param {number} 任何合法的时间格式、秒或毫秒的时间戳
 * @returns {string} 时间格式，可选。默认yyyy-mm-dd hh:MM:ss，年为"yyyy"，月为"mm"，日为"dd"，时为"hh"，分为"MM"，秒为"ss"，格式可以自由搭配，如： yyyy:mm:dd yyyy-mm-dd yyyy年mm月dd日，yyyy年mm月dd日 hh时MM分ss秒，yyyy/mm/dd/，MM:ss等组合
 */
function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd hh:MM:ss') {
    const time = new Date(dateTime);
    const Y = time.getFullYear();
    const M = time.getMonth() + 1 < 10 ? "0" + (time.getMonth() + 1) : time.getMonth() + 1;
    const D = time.getDate() < 10 ? "0" + time.getDate() : time.getDate();
    const h = time.getHours() < 10 ? "0" + time.getHours() : time.getHours();
    const m = time.getMinutes() < 10 ? "0" + time.getMinutes() : time.getMinutes();
    const s = time.getSeconds() < 10 ? "0" + time.getSeconds() : time.getSeconds();
    return Y + "-" + M + "-" + D + " " + h + ":" + m;
}

/**
 * 获取当前页带参数的url
 * @returns {string} url
 */
function getCurrentPageUrlWithArgs() {
    const pages = getCurrentPages(); // 获取加载的页面
    const currentPage = pages[pages.length - 1]; // 获取当前页面的对象
    const url = currentPage.route; // 当前页面url
    const { options } = currentPage; // 如果要获取url中所带的参数可以查看options

    //拼接url的参数
    let urlWithArgs = `${url}?`;
    for (const key in options) {
        const value = options[key];
        urlWithArgs += `${key}=${value}&`;
    }
    urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1);
    return '/' + urlWithArgs;
}

/**
 * rich-text 文本首行缩进和图片居中
 * @returns {Object} res
 */
function setRichText(res) {
    if (res.data && res.data.createTime) {
        res.data.createTime = timeFormat(res.data.createTime);
        if (res.data.content) {
            res.data.content = res.data.content.replace(/(\<img|\<p)/gi, function ($0, $1) {
                return {
                    '<img': '<img style="width:100%;height:auto;display:block;" ',
                    '<p': '<p style="text-indent: 24px;" ',
                    '<article': '<div',
                    '</article': '</div',
                    '<header': '<div',
                    '</header': '</div'
                }[$1];
            });
        }
        return res.data;
    }
}
export default {
    data() {
        return {};
    },
    getDateString,
    isNumber,
    debounce,
    throttle,
    // pages,
    setSelectTreeLevel,
    handleChildren,
    timeFormat,
    getCurrentPageUrlWithArgs,
    setRichText
};
