#!/bin/bash

# 确保脚本以 root 权限运行
if [ "$EUID" -ne 0 ]; then
    echo "❌ 错误: 请使用 root 权限或 sudo 运行此脚本！"
    exit 1
fi

SWAP_FILE="/swapfile"
FSTAB_ENTRY="$SWAP_FILE none swap sw 0 0"

# 获取当前内存和 Swap 状态
show_status() {
    echo "========================================"
    echo "       当前系统内存与 Swap 状态"
    echo "========================================"
    free -h
    echo "========================================"
}

# 1. 安装/创建 Swap
install_swap() {
    if [ -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 检测到已经存在 $SWAP_FILE。"
        echo "如果你想改变大小，请在主菜单选择 [3] 调整大小。"
        return
    fi

    read -p "请输入你想创建的 Swap 大小 (例如: 2G, 4G): " swap_size
    # 转换为大写并去掉最后的 G
    swap_size=$(echo "$swap_size" | tr 'a-z' 'A-Z' | sed 's/G//g')

    if [[ ! "$swap_size" =~ ^[0-9]+$ ]]; then
        echo "❌ 错误: 输入格式不正确，请输入类似 '2G' 或 '4G' 的数字。"
        return
    fi

    echo "⏳ 正在分配 ${swap_size}G 空间，请稍候..."
    fallocate -l "${swap_size}G" $SWAP_FILE 2>/dev/null
    if [ $? -ne 0 ]; then
        # 如果 fallocate 失败，则使用 dd
        dd if=/dev/zero of=$SWAP_FILE bs=1M count=$((swap_size * 1024))
    fi

    echo "🔒 正在锁定文件权限 (chmod 600)..."
    chmod 600 $SWAP_FILE

    echo "⚙️ 正在格式化为 Swap..."
    mkswap $SWAP_FILE

    echo "🚀 正在激活 Swap..."
    swapon $SWAP_FILE

    # 写入开机自启
    if ! grep -q "$SWAP_FILE" /etc/fstab; then
        echo "$FSTAB_ENTRY" >> /etc/fstab
    fi

    # 优化 swappiness
    sysctl vm.swappiness=10
    if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
        echo "vm.swappiness=10" >> /etc/sysctl.conf
    else
        sed -i 's/vm.swappiness.*/vm.swappiness=10/g' /etc/sysctl.conf
    fi

    echo "✅ 恭喜！${swap_size}G Swap 安装并配置成功，swappiness 已优化为 10！"
}

# 2. 卸载 Swap
uninstall_swap() {
    if [ ! -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 系统中未找到 $SWAP_FILE，无需卸载。"
        return
    fi

    echo "⏳ 正在停用 Swap（这可能需要一点时间，系统正在将数据搬回物理内存）..."
    swapoff $SWAP_FILE
    
    echo "🧹 正在删除 Swap 文件..."
    rm -f $SWAP_FILE

    echo "📝 正在清理 /etc/fstab 开机挂载配置..."
    sed -i "\|\#\? *${SWAP_FILE} *|d" /etc/fstab

    echo "✅ Swap 卸载干净了！"
}

# 3. 调整 Swap 大小
resize_swap() {
    if [ ! -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 当前未安装 Swap，将直接进入安装流程。"
        install_swap
        return
    fi

    echo "🔄 正在为您调整 Swap 大小..."
    echo "💡 提示：调整大小会先安全停用旧的 Swap，然后创建新的。"
    uninstall_swap
    echo "----------------------------------------"
    install_swap
}

# 主循环菜单
while true; do
    clear
    show_status
    echo "欢迎使用 Ubuntu Swap 一键管理脚本"
    echo "[1] 安装/创建 Swap"
    echo "[2] 完全卸载 Swap"
    echo "[3] 调整 Swap 大小"
    echo "[4] 退出脚本"
    echo "----------------------------------------"
    read -p "请输入数字选择功能 [1-4]: " choice

    case $choice in
        1)
            install_swap
            read -p "按回车键继续..." dummy
            ;;
        2)
            uninstall_swap
            read -p "按回车键继续..." dummy
            ;;
        3)
            resize_swap
            read -p "按回车键继续..." dummy
            ;;
        4)
            echo "👋 再见！"
            exit 0
            ;;
        *)
            echo "❌ 无效输入，请输入 1 到 4 之间的数字。"
            sleep 1
            ;;
    esac
done
