import CryptoJS from 'crypto-js'

/**
 * AES 加解密工具类
 */
class CryptoUtil {
    // 默认密钥（生产环境应从配置或接口获取）
    static KEY = '0123456789abcdef0123456789abcdef' // 32位密钥
    static IV = '0123456789abcdef' // 16位初始向量

    /**
     * 加密
     * @param {string} data 要加密的数据
     * @param {string} key 密钥（可选）
     * @param {string} iv 初始向量（可选）
     * @returns {string} 加密后的Base64字符串
     */
    static encrypt(data, key = this.KEY, iv = this.IV) {
        try {
            const keyHex = CryptoJS.enc.Utf8.parse(key)
            const ivHex = CryptoJS.enc.Utf8.parse(iv)

            const encrypted = CryptoJS.AES.encrypt(data, keyHex, {
                iv: ivHex,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            })

            return encrypted.toString()
        } catch (error) {
            console.error('加密失败:', error)
            throw new Error('加密失败')
        }
    }

    /**
     * 解密
     * @param {string} encryptedData 加密后的Base64字符串
     * @param {string} key 密钥（可选）
     * @param {string} iv 初始向量（可选）
     * @returns {string} 解密后的原文
     */
    static decrypt(encryptedData, key = this.KEY, iv = this.IV) {
        try {
            const keyHex = CryptoJS.enc.Utf8.parse(key)
            const ivHex = CryptoJS.enc.Utf8.parse(iv)

            const decrypted = CryptoJS.AES.decrypt(encryptedData, keyHex, {
                iv: ivHex,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            })

            return decrypted.toString(CryptoJS.enc.Utf8)
        } catch (error) {
            console.error('解密失败:', error)
            throw new Error('解密失败')
        }
    }

    /**
     * 生成随机密钥
     * @param {number} length 密钥长度（16/24/32对应128/192/256位）
     * @returns {string} 随机密钥
     */
    static generateKey(length = 32) {
        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
        let result = ''
        for (let i = 0; i < length; i++) {
            result += chars.charAt(Math.floor(Math.random() * chars.length))
        }
        return result
    }
}

export default CryptoUtil
