package com.malk.lianan.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class AesUtil {

    /**
     * AES CBC 加密
     * @param content 明文内容
     * @param key 密钥（需要16/24/32字节）
     * @return Base64编码的密文
     */
    public static String encrypt(String content, String key) {
        // 1. 创建AES对象，指定CBC模式，PKCS5Padding填充
        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
                key.getBytes(StandardCharsets.UTF_8));

        // 2. 设置IV（这里使用密钥的前16字节，但实际应该用随机IV）
        // 注意：实际项目中IV应该是随机的，每次加密都不同
        byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
        if (ivBytes.length > 16) {
            ivBytes = Arrays.copyOf(ivBytes, 16);
        } else if (ivBytes.length < 16) {
            // 填充到16字节
            ivBytes = Arrays.copyOf(ivBytes, 16);
            Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
        }
        aes.setIv(ivBytes);

        // 3. 加密并返回Base64
        byte[] encrypted = aes.encrypt(content, StandardCharsets.UTF_8);
        return Base64.encode(encrypted);
    }

    /**
     * 解密
     */
    public static String decrypt(String base64Content, String key) {
        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
                key.getBytes(StandardCharsets.UTF_8));

        byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
        if (ivBytes.length > 16) {
            ivBytes = Arrays.copyOf(ivBytes, 16);
        } else if (ivBytes.length < 16) {
            ivBytes = Arrays.copyOf(ivBytes, 16);
            Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
        }
        aes.setIv(ivBytes);

        byte[] decoded = Base64.decode(base64Content);
        return aes.decryptStr(decoded, StandardCharsets.UTF_8);
    }

}
