class CutString {
    constructor(string, limit) {
        // temparary node to parse the html tags in the string
        this.tempDiv = document.createElement('div')
        this.tempDiv.id = 'TempNodeForTest'
        this.tempDiv.innerHTML = string
        // while parsing text no of characters parsed
        this.charCount = 0
        this.limit = limit
    }

    cut() {
        var newDiv = document.createElement('div')
        this.searchEnd(this.tempDiv, newDiv)
        return newDiv.innerHTML
    }

    searchEnd(parseDiv, newParent) {
        var ele
        var newEle
        for (var j = 0; j < parseDiv.childNodes.length; j++) {
            ele = parseDiv.childNodes[j]
            // not text node
            if (ele.nodeType != 3) {
                newEle = ele.cloneNode(true)
                newParent.appendChild(newEle)
                if (ele.childNodes.length === 0) continue
                newEle.innerHTML = ''
                var res = this.searchEnd(ele, newEle)
                if (res) return res
                else {
                    continue
                }
            }
            if (ele.nodeValue.length + this.charCount >= this.limit) {
                newEle = ele.cloneNode(true)
                newEle.nodeValue = ele.nodeValue.substr(0, this.limit - this.charCount)
                newParent.appendChild(newEle)
                return true
            }
            newEle = ele.cloneNode(true)
            newParent.appendChild(newEle)
            this.charCount += ele.nodeValue.length
        }
        return false
    }
}

export function defaults(newVal, oldVal, callback) {
    let value
    if (newVal === null || newVal === undefined) {
        value = oldVal
    } else {
        value = newVal
    }

    if (callback) {
        value = callback(value)
    }

    return value
}

/**
 * html字符串裁剪
 * @param {String} html
 * @param {Number} length
 */
export function htmlCut(html, length) {
    return new CutString(html, length).cut()
}

export function timeFormat(second) {
    //秒
    var str = '' //不支持大于60分钟的时间哟
    var minute = parseInt(second / 60)
    if (minute < 10) str += '0'
    str += minute
    second = parseInt(second % 60) + ''
    if (second.length == 1) second = '0' + second
    str = str + ':' + second
    return str
}

export function monthDayFormat(date) {
    //秒
    if (date.indexOf('T') != -1) {
        return date.substring(5, 10)
    }
}

/**
 * html字符串转文本
 *  @param {String} html
 */
export const html2Text = (function () {
    const div = document.createElement('div')
    return function (html) {
        if (!html) {
            return ''
        }
        div.innerHTML = html
        return div.innerText
    }
})()

/**
 * 计算字符串长度(英文占1个字符，中文汉字占2个字符)
 * @param {*} str
 */
export function getCharLength(str = '') {
    let len = 0
    for (let i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) > 127 || str.charCodeAt(i) == 94) {
            len += 2
        } else {
            len++
        }
    }
    return len
}

/**
 * 添加url请求参数
 * @param {String} url 地址
 * @param {Object} params 参数列表
 */
export function addQueryParams(url, params = {}) {
    if (!url) {
        return ''
    }
    let has = url.indexOf('?') > -1
    let arr = []
    for (let key in params) {
        if (!url.match('&' + key + '|\\?' + key)) {
            arr.push(`${key}=${params[key]}`)
        }
    }
    if (arr.length) {
        return `${url}${has ? '&' : '?'}${arr.join('&')}`
    }

    return url
}

export function randomWord(randomFlag, min, max) {
    let str = ''
    let range = min
    let arr = [
        '0',
        '1',
        '2',
        '3',
        '4',
        '5',
        '6',
        '7',
        '8',
        '9',
        'a',
        'b',
        'c',
        'd',
        'e',
        'f',
        'g',
        'h',
        'i',
        'j',
        'k',
        'l',
        'm',
        'n',
        'o',
        'p',
        'q',
        'r',
        's',
        't',
        'u',
        'v',
        'w',
        'x',
        'y',
        'z',
        'A',
        'B',
        'C',
        'D',
        'E',
        'F',
        'G',
        'H',
        'I',
        'J',
        'K',
        'L',
        'M',
        'N',
        'O',
        'P',
        'Q',
        'R',
        'S',
        'T',
        'U',
        'V',
        'W',
        'X',
        'Y',
        'Z',
    ]
    // 随机产生
    if (randomFlag) {
        range = Math.round(Math.random() * (max - min)) + min
    }
    for (var i = 0; i < range; i++) {
        let pos = Math.round(Math.random() * (arr.length - 1))
        str += arr[pos]
    }
    return str
}
/**
 * 密码加密
 * @param {String} pwd
 */
export function password(pwd) {
    const NUM = 2
    const front = randomWord(false, 8)
    const middle = randomWord(false, 8)
    const end = randomWord(false, 8)

    let str = Base64.encode(pwd)
    let str1 = str.substring(0, NUM)
    let str2 = str.substring(NUM)

    return front + str2 + middle + str1 + end
}

/**
 * 删除输入法表情符号
 * @param {*} content
 */
export function removeEmoji(content = '') {
    return content.replace(/[\ud800-\udbff][\udc00-\udfff]/g, function (char) {
        if (char.length === 2) {
            return ''
        } else {
            return char
        }
    })
}
