import cryptojs from 'crypto-js'

/**
 * 利用 canvas 创建浏览器唯一标识
 * 由于不同客户端绘制 canvas 时渲染参数、抗锯齿等算法不同，因此绘制成图片数据的 CRC 校验也不一样
 * @param text 
 * @returns 
 */
export function getClientUUID(text = 'canvas') {
    const canvas = document.createElement('canvas')
    canvas.width = 100
    canvas.height = 100

    const ctx = canvas.getContext('2d')
    if (ctx) {
        ctx.font = '14px Arial'
        ctx.fillStyle = 'black'
        ctx.textAlign = 'center'
        ctx.textBaseline = 'middle'
        ctx.fillText(text, canvas.width / 2, canvas.height / 2) // 文本水平垂直居中
    }

    const base64Url = canvas.toDataURL()
    return cryptojs.MD5(base64Url).toString()
}

/**
 * AES加密
 * @param data 
 * @param key 
 * @returns 
 */
export function encryptAES(data: string, key = getClientUUID(), iv?: string) {
    const { enc: { Utf8 }, AES } = cryptojs
    // 统一将传入的字符串转成UTF8编码
    const _data = Utf8.parse(data) // 需要加密的数据
    const _key = Utf8.parse(key) // 秘钥
    const _iv = Utf8.parse(iv ?? key) // 偏移量
    const encrypted = AES.encrypt(_data, _key, { iv: _iv, })
    return encrypted.ciphertext.toString() //  返回加密后的值
}

/**
 * AES解密
 * @param encryptedData 
 * @param key 
 * @returns 
 */
export function decryptAES(encryptedData: string, key = getClientUUID(), iv?: string) {
    const { enc: { Utf8, Hex, Base64 }, AES } = cryptojs
    // 统一将传入的字符串转成UTF8编码
    const wordarray = Hex.parse(encryptedData)
    const _data = Base64.stringify(wordarray)
    const _key = Utf8.parse(key) // 秘钥
    const _iv = Utf8.parse(iv ?? key) // 偏移量
    const decrypted = AES.decrypt(_data, _key, { iv: _iv })
    return decrypted.toString(Utf8)
}