package com.fs.his.utils;

import com.fs.common.utils.ParseUtils;
import org.springframework.util.Base64Utils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class LinkUtil {

    // 保持密钥不变（16位 AES 密钥）
    private static final String AES_KEY = "abcedfghijklmnop";
    // 改用 CBC 模式（比 ECB 安全），搭配 PKCS5Padding
    private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding";
    // CBC 模式需要初始化向量（IV），固定 16 位（和 AES 分组长度一致）
    private static final byte[] IV = AES_KEY.getBytes(StandardCharsets.UTF_8);

    // 优化后：仅 AES + Base64URL 编码（去掉 GZIP，适配短字符串）
    public static String encryptLink(String plainText){
        try {
            if (plainText == null || plainText.isEmpty()) {
                return plainText;
            }
            // 1. 初始化 AES CBC 模式（比 ECB 安全，长度和 ECB 一致）
            SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), "AES");
            javax.crypto.spec.IvParameterSpec ivSpec = new javax.crypto.spec.IvParameterSpec(IV);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

            // 2. AES 加密
            byte[] plainBytes = plainText.getBytes(StandardCharsets.UTF_8);
            byte[] encryptBytes = cipher.doFinal(plainBytes);

            // 3. Base64URL 编码（优化：替换 +/ 为 -_，去掉 =，比标准 Base64 短）
            String base64Str = Base64Utils.encodeToString(encryptBytes);
            return base64Str.replace("+", "-").replace("/", "_").replace("=", "");
        } catch (Exception e) {
            return null;
        }
    }

    // 解密方法（可逆）
    public static String decryptLink(String cipherText){
        try {
            if (cipherText == null || cipherText.isEmpty()) {
                return cipherText;
            }
            // 1. 还原 Base64URL 为标准 Base64
            String base64Str = cipherText.replace("-", "+").replace("_", "/");
            int padding = 4 - (base64Str.length() % 4);
            if (padding != 4) {
                base64Str += "====".substring(0, padding);
            }
            byte[] encryptBytes = Base64Utils.decodeFromString(base64Str);

            // 2. AES CBC 解密
            SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), "AES");
            javax.crypto.spec.IvParameterSpec ivSpec = new javax.crypto.spec.IvParameterSpec(IV);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] plainBytes = cipher.doFinal(encryptBytes);

            return new String(plainBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            return null;
        }
    }

    // 测试：你的原字符串加密后长度对比
    /*public static void main(String[] args) throws Exception {
        String original = "/pages_live/livingList?link=2034103257541902336";
        System.out.println("原字符串长度：" + original.length()); // 约 40 字符

        // 优化后加密
        String encrypted = encryptShortStr(original);
        System.out.println("优化后加密长度：" + encrypted.length()); // 约 50 字符（从 150 大幅缩短）
        System.out.println("加密后内容：" + encrypted);

        // 解密验证可逆性
        String decrypted = decryptShortStr(encrypted);
        System.out.println("解密后是否一致：" + original.equals(decrypted)); // true
    }*/

}