package com.qqchen.deploy.backend.framework.utils;

import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;

/**
 * 加密解密工具类
 * 可独立使用，无需启动Spring容器
 * 
 * 使用场景：
 * 1. 命令行工具：加密/解密敏感数据
 * 2. 数据迁移：批量加密/解密数据库数据
 * 3. 调试：验证加密结果
 * 4. 紧急情况：在服务器上直接解密数据
 * 
 * @author qqchen
 * @since 2025-11-11
 */
public class EncryptionUtils {

    /**
     * 密码掩码
     */
    public static final String PASSWORD_MASK = "********";

    /**
     * 默认加密密钥（与配置文件一致）
     */
    private static final String DEFAULT_SECRET_KEY = "deploy-ease-platform-secret-key-2025";

    /**
     * 默认加密盐值（与配置文件一致）
     */
    private static final String DEFAULT_SALT = "a1b2c3d4e5f6a7b8";

    /**
     * 使用默认配置加密
     * 
     * @param plainText 明文
     * @return 密文
     */
    public static String encrypt(String plainText) {
        return encrypt(plainText, DEFAULT_SECRET_KEY, DEFAULT_SALT);
    }

    /**
     * 使用指定配置加密
     * 
     * @param plainText 明文
     * @param secretKey 密钥
     * @param salt 盐值（16位十六进制字符串）
     * @return 密文
     */
    public static String encrypt(String plainText, String secretKey, String salt) {
        if (plainText == null || plainText.isEmpty()) {
            return null;
        }
        try {
            TextEncryptor encryptor = Encryptors.text(secretKey, salt);
            return encryptor.encrypt(plainText);
        } catch (Exception e) {
            throw new RuntimeException("加密失败: " + e.getMessage(), e);
        }
    }

    /**
     * 使用默认配置解密
     * 
     * @param encryptedText 密文
     * @return 明文
     */
    public static String decrypt(String encryptedText) {
        return decrypt(encryptedText, DEFAULT_SECRET_KEY, DEFAULT_SALT);
    }

    /**
     * 使用指定配置解密
     * 
     * @param encryptedText 密文
     * @param secretKey 密钥
     * @param salt 盐值（16位十六进制字符串）
     * @return 明文
     */
    public static String decrypt(String encryptedText, String secretKey, String salt) {
        if (encryptedText == null || encryptedText.isEmpty()) {
            return null;
        }
        try {
            TextEncryptor encryptor = Encryptors.text(secretKey, salt);
            return encryptor.decrypt(encryptedText);
        } catch (Exception e) {
            throw new RuntimeException("解密失败: " + e.getMessage(), e);
        }
    }

    /**
     * 判断是否为掩码
     * 
     * @param value 要判断的值
     * @return true表示是掩码
     */
    public static boolean isMasked(String value) {
        return PASSWORD_MASK.equals(value);
    }

    /**
     * 命令行工具入口
     * 用法：
     * 1. 加密（使用默认配置）：
     *    java EncryptionUtils encrypt "mypassword"
     * 
     * 2. 解密（使用默认配置）：
     *    java EncryptionUtils decrypt "encrypted_text_here"
     * 
     * 3. 加密（指定配置）：
     *    java EncryptionUtils encrypt "mypassword" "your-secret-key" "0123456789abcdef"
     * 
     * 4. 解密（指定配置）：
     *    java EncryptionUtils decrypt "encrypted_text" "your-secret-key" "0123456789abcdef"
     * 
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            printUsage();
            System.exit(1);
        }

        String operation = args[0].toLowerCase();
        String input = args[1];

        try {
            String result;
            if (args.length >= 4) {
                // 使用指定的密钥和盐值
                String secretKey = args[2];
                String salt = args[3];
                
                switch (operation) {
                    case "encrypt", "enc", "e" -> {
                        result = encrypt(input, secretKey, salt);
                        System.out.println("\n=== 加密成功 ===");
                        System.out.println("明文: " + input);
                        System.out.println("密文: " + result);
                        System.out.println("长度: " + result.length());
                    }
                    case "decrypt", "dec", "d" -> {
                        result = decrypt(input, secretKey, salt);
                        System.out.println("\n=== 解密成功 ===");
                        System.out.println("密文: " + input);
                        System.out.println("明文: " + result);
                    }
                    default -> {
                        System.err.println("错误: 未知操作 '" + operation + "'");
                        printUsage();
                        System.exit(1);
                    }
                }
            } else {
                // 使用默认配置
                switch (operation) {
                    case "encrypt", "enc", "e" -> {
                        result = encrypt(input);
                        System.out.println("\n=== 加密成功（使用默认配置） ===");
                        System.out.println("明文: " + input);
                        System.out.println("密文: " + result);
                        System.out.println("长度: " + result.length());
                        System.out.println("\n提示: 如需使用自定义配置，请提供密钥和盐值参数");
                    }
                    case "decrypt", "dec", "d" -> {
                        result = decrypt(input);
                        System.out.println("\n=== 解密成功（使用默认配置） ===");
                        System.out.println("密文: " + input);
                        System.out.println("明文: " + result);
                        System.out.println("\n提示: 如需使用自定义配置，请提供密钥和盐值参数");
                    }
                    default -> {
                        System.err.println("错误: 未知操作 '" + operation + "'");
                        printUsage();
                        System.exit(1);
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("\n操作失败: " + e.getMessage());
            e.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * 打印使用说明
     */
    private static void printUsage() {
        System.out.println("\n=== 加密解密工具 ===");
        System.out.println("\n用法:");
        System.out.println("  使用默认配置:");
        System.out.println("    java EncryptionUtils encrypt <明文>");
        System.out.println("    java EncryptionUtils decrypt <密文>");
        System.out.println();
        System.out.println("  使用自定义配置:");
        System.out.println("    java EncryptionUtils encrypt <明文> <密钥> <盐值>");
        System.out.println("    java EncryptionUtils decrypt <密文> <密钥> <盐值>");
        System.out.println();
        System.out.println("示例:");
        System.out.println("  # 加密密码（默认配置）");
        System.out.println("  java EncryptionUtils encrypt \"mypassword123\"");
        System.out.println();
        System.out.println("  # 解密密码（默认配置）");
        System.out.println("  java EncryptionUtils decrypt \"encrypted_text_here\"");
        System.out.println();
        System.out.println("  # 加密密码（自定义配置）");
        System.out.println("  java EncryptionUtils encrypt \"mypassword\" \"my-secret-key-32-chars\" \"0123456789abcdef\"");
        System.out.println();
        System.out.println("注意:");
        System.out.println("  - 盐值必须是16位十六进制字符串（只能包含0-9和a-f）");
        System.out.println("  - 密钥建议至少32位");
        System.out.println("  - 使用的密钥和盐值必须与application.yml中的配置一致");
        System.out.println();
    }
}
