#!/bin/bash
set -e

# ================== 配置部分（可根据需要修改） ==================
# 默认加密目录（存放加密数据）
DEFAULT_CIPHER_DIR="./gocryptfs-cipher"
# 默认挂载点（明文访问目录）
DEFAULT_MOUNT_DIR="./gocryptfs-mount"

# ================== 颜色输出（增强可读性） ==================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# ================== 工具函数 ==================
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查 gocryptfs 是否安装
check_gocryptfs() {
    if ! command -v gocryptfs &> /dev/null; then
        print_error "gocryptfs 未安装！"
        echo "请先安装 gocryptfs："
        echo "  - Linux: sudo apt install gocryptfs"
        echo "  - macOS: brew install gocryptfs"
        exit 1
    fi
}

# ================== 核心功能函数 ==================

# 功能1：初始化加密目录
init_cipher() {
    local cipher_dir=${1:-$DEFAULT_CIPHER_DIR}
    
    print_info "开始初始化加密目录..."
    
    # 检查目录是否已存在且已初始化
    if [ -d "$cipher_dir" ] && [ -f "$cipher_dir/gocryptfs.conf" ]; then
        print_error "加密目录 $cipher_dir 已存在且已初始化！"
        exit 1
    fi
    
    # 创建目录（如果不存在）
    mkdir -p "$cipher_dir"
    
    # 初始化加密目录
    print_info "请设置加密密码（请务必记住密码！）"
    gocryptfs -init "$cipher_dir"
    
    print_info "====================================="
    print_info "  加密目录初始化成功！"
    print_info "  加密目录：$cipher_dir"
    print_info "  【重要】请妥善保管上方显示的 Master Key！"
    print_info "====================================="
}

# 功能2：挂载加密目录
mount_cipher() {
    local cipher_dir=${1:-$DEFAULT_CIPHER_DIR}
    local mount_dir=${2:-$DEFAULT_MOUNT_DIR}
    
    print_info "开始挂载加密目录..."
    
    # 检查加密目录是否已初始化
    if [ ! -f "$cipher_dir/gocryptfs.conf" ]; then
        print_error "加密目录 $cipher_dir 未初始化！请先运行 init 命令。"
        exit 1
    fi
    
    # 创建挂载点（如果不存在）
    mkdir -p "$mount_dir"
    
    # 检查是否已挂载
    if mount | grep -q "$mount_dir"; then
        print_warn "挂载点 $mount_dir 已挂载！"
        exit 0
    fi
    
    # 挂载加密目录
    print_info "请输入加密密码："
    gocryptfs "$cipher_dir" "$mount_dir"
    
    print_info "====================================="
    print_info "  加密目录挂载成功！"
    print_info "  加密目录：$cipher_dir"
    print_info "  挂载点（明文访问）：$mount_dir"
    print_info "====================================="
}

# 功能3：卸载加密目录
umount_cipher() {
    local mount_dir=${1:-$DEFAULT_MOUNT_DIR}
    
    print_info "开始卸载加密目录..."
    
    # 检查是否已挂载
    if ! mount | grep -q "$mount_dir"; then
        print_warn "挂载点 $mount_dir 未挂载！"
        exit 0
    fi
    
    # 卸载（兼容 Linux 和 macOS）
    if [[ "$OSTYPE" == "darwin"* ]]; then
        # macOS
        umount "$mount_dir"
    else
        # Linux
        fusermount -u "$mount_dir"
    fi
    
    print_info "====================================="
    print_info "  加密目录卸载成功！"
    print_info "  挂载点：$mount_dir"
    print_info "====================================="
}

# 功能4：显示帮助信息
show_help() {
    echo "====================================="
    echo "  gocryptfs 加密目录管理脚本"
    echo "====================================="
    echo "用法："
    echo "  $0 init [加密目录路径]     - 初始化加密目录（仅需一次）"
    echo "  $0 mount [加密目录] [挂载点] - 挂载加密目录"
    echo "  $0 umount [挂载点]           - 卸载加密目录"
    echo "  $0 help                      - 显示此帮助信息"
    echo ""
    echo "示例："
    echo "  # 使用默认路径初始化"
    echo "  $0 init"
    echo ""
    echo "  # 使用默认路径挂载"
    echo "  $0 mount"
    echo ""
    echo "  # 使用自定义路径"
    echo "  $0 init ~/my-cipher"
    echo "  $0 mount ~/my-cipher ~/my-mount"
    echo "  $0 umount ~/my-mount"
    echo "====================================="
}

# ================== 主程序入口 ==================
main() {
    check_gocryptfs
    
    case "${1:-help}" in
        init)
            init_cipher "$2"
            ;;
        mount)
            mount_cipher "$2" "$3"
            ;;
        umount)
            umount_cipher "$2"
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            print_error "未知命令：$1"
            show_help
            exit 1
            ;;
    esac
}

# 运行主程序
main "$@"
