#!/bin/bash

# JSON配置文件加密解密脚本 - 支持自定义文件名
# 使用 openssl 进行 AES-256-CBC 加密

# 显示菜单
show_menu() {
    echo "JSON配置文件加密工具"
    echo "====================="
    echo "1. 加密文件"
    echo "2. 解密文件"
    echo "3. 查看加密文件内容（临时解密）"
    echo "4. 列出当前目录的文件"
    echo "5. 退出"
    echo
    read -p "请选择操作 (1-5): " choice
}

# 获取不带.enc后缀的文件名
get_original_name() {
    local filename="$1"
    if [[ "$filename" == *.enc ]]; then
        echo "${filename%.enc}"
    else
        echo "$filename"
    fi
}

# 输入文件名并验证
input_filename() {
    local prompt="$1"
    local filename
    
    while true; do
        read -p "$prompt" filename
        
        # 检查是否为空
        if [ -z "$filename" ]; then
            echo "文件名不能为空，请重新输入"
            continue
        fi
        
        # 移除路径，只保留文件名
        filename=$(basename "$filename")
        echo "$filename"
        return 0
    done
}

# 列出当前目录文件
list_files() {
    echo "当前目录的文件:"
    echo "=================="
    echo "普通文件:"
    ls -la *.json *.txt *.conf *.cfg 2>/dev/null | grep "^-" || echo "  (未找到常见配置文件)"
    echo
    echo "加密文件:"
    ls -la *.enc 2>/dev/null | grep "^-" || echo "  (未找到加密文件)"
    echo
}

# 加密文件
encrypt_file() {
    echo "=== 文件加密 ==="
    
    # 输入要加密的文件名
    local source_file
    source_file=$(input_filename "请输入要加密的文件名: ")
    
    # 检查文件是否存在
    if [ ! -f "$source_file" ]; then
        echo "错误: 文件 '$source_file' 不存在"
        return 1
    fi
    
    # 生成加密文件名（保持原文件名，添加.enc后缀）
    local encrypted_file="${source_file}.enc"
    
    # 如果加密文件已存在，询问是否覆盖
    if [ -f "$encrypted_file" ]; then
        read -p "加密文件 '$encrypted_file' 已存在，是否覆盖? (y/n): " overwrite
        if [ "$overwrite" != "y" ] && [ "$overwrite" != "Y" ]; then
            echo "操作已取消"
            return 1
        fi
    fi
    
    echo "源文件: $source_file"
    echo "目标文件: $encrypted_file"
    echo
    echo "正在加密 '$source_file' ..."
    echo "请输入加密密码:"
    
    if openssl enc -aes-256-cbc -salt -in "$source_file" -out "$encrypted_file" -pbkdf2; then
        echo "加密成功! 生成文件: $encrypted_file"
        echo "文件大小: $(du -h "$encrypted_file" | cut -f1)"
        
        echo
        read -p "是否删除原始文件 '$source_file'? (y/n): " delete_original
        if [ "$delete_original" = "y" ] || [ "$delete_original" = "Y" ]; then
            rm "$source_file"
            echo "原始文件 '$source_file' 已删除"
        fi
    else
        echo "加密失败!"
        return 1
    fi
}

# 解密文件
decrypt_file() {
    echo "=== 文件解密 ==="
    
    # 输入要解密的文件名
    local encrypted_file
    encrypted_file=$(input_filename "请输入要解密的加密文件名: ")
    
    # 自动添加.enc扩展名（如果用户没有输入）
    if [[ "$encrypted_file" != *.enc ]]; then
        encrypted_file="${encrypted_file}.enc"
    fi
    
    # 检查加密文件是否存在
    if [ ! -f "$encrypted_file" ]; then
        echo "错误: 加密文件 '$encrypted_file' 不存在"
        return 1
    fi
    
    # 生成解密后的文件名（去除.enc后缀）
    local original_name=$(get_original_name "$encrypted_file")
    local output_file
    
    echo "检测到加密文件: $encrypted_file"
    echo "原始文件名: $original_name"
    read -p "请输入解密后的文件名 (直接回车使用 '$original_name'): " custom_output
    
    if [ -n "$custom_output" ]; then
        output_file="$custom_output"
    else
        output_file="$original_name"
    fi
    
    # 如果输出文件已存在，询问是否覆盖
    if [ -f "$output_file" ]; then
        read -p "文件 '$output_file' 已存在，是否覆盖? (y/n): " overwrite
        if [ "$overwrite" != "y" ] && [ "$overwrite" != "Y" ]; then
            echo "操作已取消"
            return 1
        fi
    fi
    
    echo "加密文件: $encrypted_file"
    echo "输出文件: $output_file"
    echo
    echo "正在解密 '$encrypted_file' ..."
    echo "请输入解密密码:"
    
    if openssl enc -aes-256-cbc -d -in "$encrypted_file" -out "$output_file" -pbkdf2; then
        echo "解密成功! 生成文件: $output_file"
        echo "文件大小: $(du -h "$output_file" | cut -f1)"
    else
        echo "解密失败! 请检查密码是否正确"
        # 如果解密失败，删除可能创建的空文件
        [ -f "$output_file" ] && rm "$output_file"
        return 1
    fi
}

# 临时查看内容（不生成文件）
view_content() {
    echo "=== 临时查看文件内容 ==="
    
    # 输入要查看的加密文件名
    local encrypted_file
    encrypted_file=$(input_filename "请输入要查看的加密文件名: ")
    
    # 自动添加.enc扩展名（如果用户没有输入）
    if [[ "$encrypted_file" != *.enc ]]; then
        encrypted_file="${encrypted_file}.enc"
    fi
    
    # 检查加密文件是否存在
    if [ ! -f "$encrypted_file" ]; then
        echo "错误: 加密文件 '$encrypted_file' 不存在"
        return 1
    fi
    
    echo "临时解密查看文件: $encrypted_file"
    echo "请输入解密密码:"
    echo "================================"
    
    if openssl enc -aes-256-cbc -d -in "$encrypted_file" -pbkdf2 2>/dev/null; then
        echo ""
        echo "================================"
        echo "内容查看完毕（未生成文件）"
    else
        echo ""
        echo "================================"
        echo "解密失败! 请检查密码是否正确"
        return 1
    fi
}

# 主函数
main() {
    echo "支持自定义文件名的加密工具"
    echo "加密规则: 原文件名.enc (如: config.json → config.json.enc)"
    echo "支持任意文件类型: .json .txt .conf .cfg 等"
    echo "====================================================="
    
    while true; do
        echo
        show_menu
        
        case $choice in
            1)
                encrypt_file
                ;;
            2)
                decrypt_file
                ;;
            3)
                view_content
                ;;
            4)
                list_files
                ;;
            5)
                echo "退出程序"
                exit 0
                ;;
            *)
                echo "无效选择，请重新输入"
                ;;
        esac
        echo
        read -p "按回车键继续..."
    done
}

# 执行主函数
main
