import CryptoJS from 'crypto-js'

// 配置参数
const MODE_CBC = "CBC"
const PADDING_MODE = "PKCS7Padding"
const DEFAULT_IV = "@ZiyiTechProduct"
const AES_DEFAULT_KEY = "ZiyiTechPro#2025"

// AES-CBC 加密(输出Hex字符串)
export function encryptAESCBC(data) {
    const key = CryptoJS.enc.Utf8.parse(AES_DEFAULT_KEY)
    const iv = CryptoJS.enc.Utf8.parse(DEFAULT_IV)

    // 统一将输入转为字符串
    const plaintext = typeof data === 'object' 
        ? JSON.stringify(data) 
        : String(data)

    // 加密并输出Hex字符串
    const encrypted = CryptoJS.AES.encrypt(
        plaintext,
        key, 
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    ).ciphertext.toString(CryptoJS.enc.Hex) // 直接提取二进制密文转为Hex

    return encrypted
}

// AES-CBC 解密(处理Hex字符串输入)
export function decryptAESCBC(encryptedHex) {
    const key = CryptoJS.enc.Utf8.parse(AES_DEFAULT_KEY)
    const iv = CryptoJS.enc.Utf8.parse(DEFAULT_IV)

    // 将Hex字符串解析为CryptoJS的密文对象
    const ciphertext = CryptoJS.enc.Hex.parse(encryptedHex)
    const encryptedData = { ciphertext: ciphertext }

    // 解密
    const decrypted = CryptoJS.AES.decrypt(
        encryptedData,
        key, 
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    )

    // 统一输出为字符串(自动处理JSON或普通字符串)
    const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8)
    try {
        return JSON.parse(decryptedStr)
    } catch {
        return decryptedStr
    }
}