/*************************************************
 * @desc 公共工具类
 * @author zhangshuwei
 * @time 2022年12月12日
 * @Email 2966211270@qq.com
 */
import CryptoJS from 'crypto-js'
import configCms from './configCms'
import { getStorage } from './storage'

/*************************************************
 * @desc 处理时间 M-D h-m
 * @param {time}-需要处理的时间
 * @return {time} - -MM-DD h-m
 */
export const timeFormatDHM = (time?: number | string) => {
    let timer = time ? new Date(time) : new Date()
    return `${(timer.getMonth() + 1) < 10 ? '0' + (timer.getMonth() + 1) : (timer.getMonth() + 1)}-${timer.getDate() < 10 ? '0' + timer.getDate() : timer.getDate()} ${timer.getHours() < 10 ? '0' + timer.getHours() : timer.getHours()}:${timer.getMinutes() < 10 ? '0' + timer.getMinutes() : timer.getMinutes()}`
}


/*************************************************
 * @desc 处理时间 YYY-M-D h-m-s
 * @param {time}-需要处理的时间
 * @return {time} - YYYY-MM-DD h-m-s
 */
export const timeFormatHMS = (time?: number | string) => {
    let timer = time ? new Date(time) : new Date()
    return `${timer.getFullYear()}-${(timer.getMonth() + 1) < 10 ? '0' + (timer.getMonth() + 1) : (timer.getMonth() + 1)}-${timer.getDate() < 10 ? '0' + timer.getDate() : timer.getDate()} ${timer.getHours() < 10 ? '0' + timer.getHours() : timer.getHours()}:${timer.getMinutes() < 10 ? '0' + timer.getMinutes() : timer.getMinutes()}:${timer.getSeconds() < 10 ? '0' + timer.getSeconds() : timer.getSeconds()}`
}


/*************************************************
 * @desc 处理时间 YYY-M-D h-m
 * @param {time}-需要处理的时间
 * @return {time} - YYYY-MM-DD h-m
 */
export const timeFormatHM = (time?: number | string) => {
    let timer = time ? new Date(time) : new Date()
    return `${timer.getFullYear()}-${(timer.getMonth() + 1) < 10 ? '0' + (timer.getMonth() + 1) : (timer.getMonth() + 1)}-${timer.getDate() < 10 ? '0' + timer.getDate() : timer.getDate()}  ${timer.getHours() < 10 ? '0' + timer.getHours() : timer.getHours()}:${timer.getMinutes() < 10 ? '0' + timer.getMinutes() : timer.getMinutes()}`
}

/*************************************************
 * @desc 处理时间 YYY-M-D
 * @param {time}-需要处理的时间
 * @return {time} - YYYY-MM-DD
 */
export const timeFormatD = (time?: number | string) => {
    let timer = time ? new Date(time) : new Date()
    return `${timer.getFullYear()}-${(timer.getMonth() + 1) < 10 ? '0' + (timer.getMonth() + 1) : (timer.getMonth() + 1)}-${timer.getDate() < 10 ? '0' + timer.getDate() : timer.getDate()}`
}


/*************************************************
 * @desc 处理时间是否为空时间
 * @param {data}-处理空时间
 */
export const isNullDate = (date: string) => {
    if (!date || date.indexOf('1970-01-01') !== -1 || date.indexOf('0001-01-01') !== -1) {
        return true
    } else {
        return false
    }
}


/*************************************************
 * @desc 判断分页是否有下一页
 * @param {pageNo}-当前页数
 * @param {size}-每页条数
 * @param {totalCount}-总条数
 * @param {fn}回调方法
 * @return {boolean} 是否有下一条
 */
export const jxNextPage = (pageNo: number, size: number, totalCount: number, fn: Function) => {
    let sumNum = pageNo * size
    if (sumNum >= totalCount) {
        // 没有下一页
        fn && fn(false)
    } else {
        // 有下一页
        fn && fn(true)
    }
}


/*************************************************
 * @desc 微信小程序 App 版本判断
 * @param {ver1}-原始版本号
 * @param {ver1}-需要判断的版本号
 * @return {boolean} 版本号大小判断
 */
export const versionCompare = (ver1: string, ver2: string) => {
    let version1pre = parseFloat(ver1)
    let version2pre = parseFloat(ver2)
    let version1next = parseInt(ver1.replace(version1pre + '.', ''))
    let version2next = parseInt(ver2.replace(version2pre + '.', ''))
    if (version1pre > version2pre) return true
    else if (version1pre < version2pre) return false
    else {
        if (version1next > version2next) return true
        else return false
    }
}


/*************************************************
 * 防抖函数
 * @param {Function} [fun]  防抖成功回调
 * @param {number} [time] 防抖时间
 * 
 */
export function jx_trembling(fun: Function, time: number) {
    let timer: any = null
    return function (this: any, ...args: any) {
        clearTimeout(timer)
        timer = setTimeout(() => {
            fun.apply(this, args)
        }, time)
    }
}



interface jx_throttlesType {
    /*************************************************
     * 节流时间
     */
    time: number
    /*************************************************
     * 节流成功回调
     */
    success: Function
    /*************************************************
     * 节流失败回调
     */
    fail?: Function
}
/*************************************************
 * 节流函数
 */
export function jx_throttles(options: jx_throttlesType) {
    let pre: number = 0
    return function (this: any, ...args: any) {
        let now = Date.now()
        if (now - pre >= options.time) {
            options.success && options.success.apply(this, args)
            pre = Date.now()
        } else {
            options.fail && options.fail((((pre - now) / 1000) + options.time / 1000).toFixed(0))
        }
    }
}


/*************************************************
 * ASE解密
 * @param {string} word 解密字符串
 * @return {string} utf8 明文
*/
export function Decrypt(word: string, platformID: string) {
    let appKey = ''
    if (getStorage('terrace') == 'jxcs' || getStorage('terrace') == 'gblm') {
        appKey = platformID === '5873' ? 'app_key_5873' : 'app_key_589'
    } else {
        appKey = 'app_key_4123'
    }
    let key =  (configCms as AnyObject)[appKey]
    let iv =  (configCms as AnyObject)[appKey]

    key = CryptoJS.enc.Utf8.parse(key)
    iv = CryptoJS.enc.Utf8.parse(iv)
    let base64 = CryptoJS.enc.Base64.parse(word)
    let src = CryptoJS.enc.Base64.stringify(base64)
    // 解密模式为CBC，补码方式为PKCS5Padding（也就是PKCS7）
    let decrypt = CryptoJS.AES.decrypt(src, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7,
    })

    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
    return decryptedStr.toString()
}


/*************************************************
 * ASE加密
*/
export function Encrypt(word: string, platformID: string) {
    let appKey = ''
    if (getStorage('terrace') == 'jxcs') {
        appKey = platformID === '5873' ? 'app_key_5873' : 'app_key_589'
    } else {
        appKey = 'app_key_4123'
    }
    let key =  (configCms as AnyObject)[appKey]
    let iv =  (configCms as AnyObject)[appKey]

    key = CryptoJS.enc.Utf8.parse(key);
    iv = CryptoJS.enc.Utf8.parse(iv);

    let srcs = CryptoJS.enc.Utf8.parse(word);
    // 加密模式为CBC，补码方式为PKCS5Padding（也就是PKCS7）
    let encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

}

// ******************** 请求加载提示 *****************************
//#region 
/**
* @function 请求加载提示
* @description 传递一个说明内容【有参数showLoading，无参数hideLoading】
* @param  value  {string} 加载提示内容【非必传】
* @return void
* @example 
* setLoading('登录中')
*/
export function setLoading(value?: string) {
    if (value) {
        uni.showLoading({ title: value })
    } else {
        uni.hideLoading()
    }
}
//#endregion


// ******************** 添加请求记录与中断请求 *****************************
//#region 
let requestTaskList: Array<AnyObject> = [] // 请求列表
/**
* @function 添加请求记录
* @description 传递一个task对象
* @param  task  {object} task对象
* @return void
* @example 
* addTask({})
*/
export function addTask(task: AnyObject): void {
    if (requestTaskList.length >= 17) {
        requestTaskList = []
    }
    requestTaskList.push(task)
}

/**
* @function 中断请求
* @description 无参数
* @return void
* @example 
* clearList()
*/
export function clearList(): void {
    requestTaskList.forEach((item) => {
        item.abort()
    })
    requestTaskList = []
}
//#endregion

/**
 * JOSN.parse 导致number类型超过十五位会失真
 * string to json
 */
export function jxParse(text: string) {
    let aa = text.replace(/:s*([0-9]{15,})s*(,?)/g, ': "$1" $2')
    return JSON.parse(aa)
}

export function formatBusinessTime(time:string) {
    let newTime = ''
        let len = (time.toString()).length
        switch (len) {
            case 1:
                newTime = `000${time}`
                break
            case 2:
                newTime = `00${time}`
                break
            case 3:
                newTime = `0${time}`
                break
            default:
                newTime = time.toString()
                break
        }
        let str =`${newTime.slice(0, 2)}:${newTime.slice(-2)}`
        return str
}