#!/bin/bash
# =============================================
# MySQL 一键安装配置脚本 (Proot Ubuntu) - 优化版
# 功能：版本选择 | 性能定制 | 自动修复 | 别名 | 自动导入 GPG 密钥 | 安全加固
# 扩展：管理工具 (Adminer / phpMyAdmin) | 完整 Web 环境 | 卸载
# =============================================

set -o pipefail  # 管道命令中任一失败则返回失败
# 不全局 set -e，改为在关键命令后手动检查，避免意外退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志文件
LOG_FILE="/tmp/mysql_install_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1

# 检查 whiptail
if ! command -v whiptail &> /dev/null; then
    echo -e "${YELLOW}whiptail 未安装，正在安装...${NC}"
    apt update && apt install -y whiptail
fi

# ================= 基础依赖检查 =================
BASE_DEPS=("curl" "wget" "gnupg" "lsb-release" "ca-certificates" "apt-transport-https" "debconf-utils")

install_base_deps() {
    local to_install=()
    for pkg in "${BASE_DEPS[@]}"; do
        if ! dpkg -s "$pkg" &>/dev/null; then
            to_install+=("$pkg")
        fi
    done
    if [ ${#to_install[@]} -gt 0 ]; then
        echo -e "${YELLOW}安装基础依赖: ${to_install[*]}${NC}"
        apt update
        apt install -y "${to_install[@]}"
    fi
}

# ================= 交互 UI 函数（带错误保护） =================
msgbox() {
    set +e
    whiptail --title "MySQL 安装助手" --msgbox "$1" 12 70
    set -e
}

yesno() {
    set +e
    whiptail --title "MySQL 安装助手" --yesno "$1" 10 70
    local ret=$?
    set -e
    return $ret
}

inputbox() {
    set +e
    local result
    result=$(whiptail --title "MySQL 安装助手" --inputbox "$1" 10 70 "$2" 3>&1 1>&2 2>&3)
    local ret=$?
    set -e
    if [ $ret -eq 0 ]; then
        echo "$result"
    else
        echo "$2"
    fi
    return $ret
}

passwordbox() {
    set +e
    local result
    result=$(whiptail --title "MySQL 安装助手" --passwordbox "$1" 10 70 3>&1 1>&2 2>&3)
    local ret=$?
    set -e
    if [ $ret -eq 0 ]; then
        echo "$result"
    else
        echo ""
    fi
    return $ret
}

# ================= 导入 MySQL GPG 公钥（多密钥支持） =================
import_mysql_gpg_keys() {
    echo -e "${YELLOW}正在导入 MySQL GPG 公钥...${NC}"

    # 确保 gnupg 已安装
    if ! command -v gpg &> /dev/null; then
        apt install -y gnupg
    fi

    mkdir -p /usr/share/keyrings

    # 官方密钥 URL 列表（涵盖不同时期密钥）
    local key_urls=(
        "https://repo.mysql.com/RPM-GPG-KEY-mysql-2022"
        "https://repo.mysql.com/RPM-GPG-KEY-mysql-2023"
        "https://repo.mysql.com/RPM-GPG-KEY-mysql-2024"
        "https://repo.mysql.com/RPM-GPG-KEY-mysql"  # 旧版
    )

    local imported=0
    for url in "${key_urls[@]}"; do
        local key_name=$(basename "$url")
        local key_path="/usr/share/keyrings/${key_name}.gpg"
        if [ -f "$key_path" ]; then
            echo -e "${GREEN}密钥 $key_name 已存在，跳过下载。${NC}"
            imported=1
            continue
        fi
        echo -e "${YELLOW}尝试下载 $key_name ...${NC}"
        if curl -fsSL -o "/tmp/${key_name}" "$url"; then
            gpg --dearmor -o "$key_path" "/tmp/${key_name}" && rm -f "/tmp/${key_name}"
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}密钥 $key_name 导入成功。${NC}"
                imported=1
            fi
        fi
    done

    if [ $imported -eq 1 ]; then
        # 将密钥链接到 trusted.gpg.d（兼容旧版 apt-key）
        if [ -d /etc/apt/trusted.gpg.d ]; then
            cp /usr/share/keyrings/*mysql*.gpg /etc/apt/trusted.gpg.d/ 2>/dev/null || true
        fi
        # 如果 apt-key 存在，也添加
        if command -v apt-key &> /dev/null; then
            for key in /usr/share/keyrings/*mysql*.gpg; do
                apt-key add "$key" 2>/dev/null || true
            done
        fi
        echo -e "${GREEN}MySQL GPG 公钥导入完成。${NC}"
        return 0
    else
        echo -e "${RED}所有 GPG 密钥导入方式均失败，请检查网络。${NC}"
        return 1
    fi
}

# ================= 配置 MySQL APT 源 =================
setup_mysql_apt_source() {
    local version="$1"  # 8.0 或 5.7
    echo -e "${YELLOW}配置 MySQL ${version} APT 源...${NC}"

    # 方法1：使用官方 mysql-apt-config 包（动态获取最新版本）
    local latest_deb_url="https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb"  # 已知最后版本，也可能需要更新
    local deb_file="/tmp/mysql-apt-config.deb"
    if curl -fsSL -o "$deb_file" "$latest_deb_url"; then
        echo -e "${YELLOW}使用 mysql-apt-config 包配置源...${NC}"
        # 预选版本
        if [ "$version" = "5.7" ]; then
            echo "mysql-apt-config mysql-apt-config/select-server select mysql-5.7" | debconf-set-selections
        else
            echo "mysql-apt-config mysql-apt-config/select-server select mysql-8.0" | debconf-set-selections
        fi
        dpkg -i "$deb_file"
        rm -f "$deb_file"
        apt update
        return 0
    else
        echo -e "${YELLOW}无法下载 mysql-apt-config，尝试手动创建源文件...${NC}"
        # 方法2：手动创建 /etc/apt/sources.list.d/mysql.list
        local codename=$(lsb_release -sc)
        local repo_url="http://repo.mysql.com/apt/ubuntu/"
        local list_file="/etc/apt/sources.list.d/mysql.list"

        # 动态选择可用的密钥文件
        local key_file=""
        if [ "$version" = "5.7" ]; then
            key_file=$(ls /usr/share/keyrings/RPM-GPG-KEY-mysql-2022.gpg 2>/dev/null || true)
            [ -z "$key_file" ] && key_file=$(ls /usr/share/keyrings/RPM-GPG-KEY-mysql*.gpg 2>/dev/null | head -1)
        else
            key_file=$(ls /usr/share/keyrings/RPM-GPG-KEY-mysql-2023.gpg 2>/dev/null || true)
            [ -z "$key_file" ] && key_file=$(ls /usr/share/keyrings/RPM-GPG-KEY-mysql*.gpg 2>/dev/null | head -1)
        fi

        if [ -n "$key_file" ]; then
            echo "deb [signed-by=$key_file] ${repo_url} ${codename} mysql-${version}" > "$list_file"
            echo "deb [signed-by=$key_file] ${repo_url} ${codename} mysql-tools" >> "$list_file"
        else
            # 无 signed-by 回退（依赖 trusted.gpg.d 或 apt-key）
            echo "deb ${repo_url} ${codename} mysql-${version}" > "$list_file"
            echo "deb ${repo_url} ${codename} mysql-tools" >> "$list_file"
        fi
        apt update
        return 0
    fi
}

# ================= 版本选择与源配置（整合入口） =================
select_mysql_version() {
    local version_choice
    version_choice=$(whiptail --title "选择 MySQL 版本" --menu "请选择要安装的版本：" 12 60 2 \
        "8.0" "最新稳定版（推荐）" \
        "5.7" "传统版本（需配置官方源）" 3>&1 1>&2 2>&3 || echo "")
    
    if [ -z "$version_choice" ]; then
        msgbox "未选择版本，默认使用 8.0"
        MYSQL_VER="8.0"
    else
        MYSQL_VER="$version_choice"
    fi

    # 导入 GPG 密钥
    if ! import_mysql_gpg_keys; then
        msgbox "GPG 密钥导入失败，无法继续。"
        return 1
    fi

    # 配置 APT 源
    if ! setup_mysql_apt_source "$MYSQL_VER"; then
        msgbox "配置 MySQL APT 源失败。"
        return 1
    fi

    msgbox "已配置 MySQL $MYSQL_VER 官方源，准备安装。"
    return 0
}

# ================= 性能配置交互 =================
configure_performance() {
    local TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}')
    [ -z "$TOTAL_MEM" ] || [ "$TOTAL_MEM" -lt 512 ] && TOTAL_MEM=1024
    local DEFAULT_POOL_SIZE=$(( TOTAL_MEM * 70 / 100 ))M

    local PERF_RESULT
    set +e
    PERF_RESULT=$(whiptail --title "性能参数配置" --form "设置关键参数（回车使用默认值）：" 15 70 3 \
        "InnoDB缓冲池大小 (如 512M, 1G):" 1 1 "$DEFAULT_POOL_SIZE" 1 40 20 0 \
        "最大连接数 (默认151):" 2 1 "151" 2 40 20 0 \
        "慢查询阈值 (秒, 默认2):" 3 1 "2" 3 40 20 0 3>&1 1>&2 2>&3)
    local ret=$?
    set -e

    if [ $ret -eq 0 ]; then
        local pool=$(echo "$PERF_RESULT" | sed -n '1p')
        local conn=$(echo "$PERF_RESULT" | sed -n '2p')
        local slow=$(echo "$PERF_RESULT" | sed -n '3p')
        INNODB_POOL=${pool:-$DEFAULT_POOL_SIZE}
        MAX_CONN=${conn:-151}
        SLOW_QUERY=${slow:-2}
    else
        INNODB_POOL="$DEFAULT_POOL_SIZE"
        MAX_CONN="151"
        SLOW_QUERY="2"
    fi
}

# ================= 生成配置文件（追加自定义配置，不覆盖原文件） =================
generate_config() {
    local config_dir="/etc/mysql/mysql.conf.d/"
    local custom_file="${config_dir}zz-custom.cnf"
    [ -d "$config_dir" ] || mkdir -p "$config_dir"

    # 备份现有自定义文件
    if [ -f "$custom_file" ]; then
        cp "$custom_file" "${custom_file}.bak.$(date +%s)"
    fi

    cat > "$custom_file" <<EOF
[mysqld]
# 自定义配置 - 由脚本生成
user = root
bind-address = 127.0.0.1
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

innodb_buffer_pool_size = $INNODB_POOL
max_connections = $MAX_CONN
long_query_time = $SLOW_QUERY
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
secure-file-priv = ""
EOF

    if [ "$MYSQL_VER" = "5.7" ]; then
        cat >> "$custom_file" <<EOF
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
default_authentication_plugin = mysql_native_password
EOF
    else
        cat >> "$custom_file" <<EOF
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default_authentication_plugin = caching_sha2_password
EOF
    fi
    echo -e "${GREEN}自定义配置已写入 $custom_file${NC}"
}

# ================= 自动修复常见问题 =================
fix_common_issues() {
    echo -e "${YELLOW}执行自动修复...${NC}"
    # 禁用 MariaDB 冲突配置
    if [ -d "/etc/mysql/mariadb.conf.d" ]; then
        mv /etc/mysql/mariadb.conf.d /etc/mysql/mariadb.conf.d.bak.$(date +%s)
        sed -i 's/^!includedir \/etc\/mysql\/mariadb.conf.d/#&/' /etc/mysql/my.cnf 2>/dev/null || true
    fi

    # 创建必要目录
    mkdir -p /var/lib/mysql-files
    chmod 1777 /var/lib/mysql-files 2>/dev/null || true
    mkdir -p /var/run/mysqld
    chmod 755 /var/run/mysqld 2>/dev/null || true

    # 清理非空数据目录（谨慎）
    if [ -d "/var/lib/mysql" ] && [ "$(ls -A /var/lib/mysql 2>/dev/null)" ]; then
        if yesno "检测到数据目录非空，是否清理？（现有数据将丢失）"; then
            rm -rf /var/lib/mysql/*
        fi
    fi
    echo -e "${GREEN}自动修复完成。${NC}"
}

# ================= 安装 MySQL =================
install_mysql() {
    echo -e "${YELLOW}开始安装 MySQL $MYSQL_VER ...${NC}"
    if ! apt install -y mysql-server; then
        msgbox "安装失败，请检查网络或软件源。"
        return 1
    fi
    fix_common_issues
    generate_config
    echo -e "${GREEN}MySQL 安装完成。${NC}"
    return 0
}

# ================= 初始化数据库（使用 --initialize-insecure，避免临时密码问题） =================
init_database() {
    echo -e "${YELLOW}初始化数据库（使用空密码模式）...${NC}"
    mkdir -p /var/run/mysqld
    chmod 755 /var/run/mysqld 2>/dev/null || true

    # 如果数据目录已有内容，则询问是否强制重新初始化
    if [ -d "/var/lib/mysql" ] && [ "$(ls -A /var/lib/mysql 2>/dev/null)" ]; then
        if ! yesno "数据目录非空，初始化将清空所有数据。是否继续？"; then
            return 1
        fi
    fi

    rm -rf /var/lib/mysql/*
    # 使用 --initialize-insecure，root 密码为空
    if mysqld --initialize-insecure --user=root; then
        echo -e "${GREEN}初始化成功，root 密码为空。${NC}"
        return 0
    else
        echo -e "${RED}初始化失败，请检查错误日志 /var/log/mysql/error.log${NC}"
        return 1
    fi
}

# ================= 启动 MySQL（优先系统服务） =================
start_mysql() {
    echo -e "${YELLOW}启动 MySQL...${NC}"
    # 尝试使用 systemctl
    if command -v systemctl &>/dev/null && systemctl is-system-running &>/dev/null; then
        systemctl start mysql
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}MySQL 已通过 systemctl 启动。${NC}"
            return 0
        fi
    fi
    # 尝试使用 service
    if command -v service &>/dev/null; then
        service mysql start
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}MySQL 已通过 service 启动。${NC}"
            return 0
        fi
    fi
    # 回退：手动启动
    echo -e "${YELLOW}系统服务启动失败，尝试手动启动...${NC}"
    mkdir -p /var/run/mysqld
    chmod 755 /var/run/mysqld
    pkill mysqld 2>/dev/null || true
    sleep 1
    mysqld --user=root &
    sleep 5
    if pgrep mysqld > /dev/null; then
        echo -e "${GREEN}MySQL 已手动启动。${NC}"
        return 0
    else
        echo -e "${RED}启动失败，请检查日志 /var/log/mysql/error.log${NC}"
        return 1
    fi
}

# ================= 修改 root 密码 =================
change_password() {
    local current_pwd=""
    if [ -f /root/.mysql_temp_pass ]; then
        current_pwd=$(cat /root/.mysql_temp_pass)
    else
        # 如果初始化使用了空密码，则直接询问
        current_pwd=$(passwordbox "请输入当前 root 密码（若为空直接回车）：" "")
        [ $? -ne 0 ] && return 1
    fi

    local new_pwd=$(passwordbox "请输入新 root 密码：")
    [ $? -ne 0 ] && return 1
    local confirm_pwd=$(passwordbox "再次输入新密码：")
    if [ "$new_pwd" != "$confirm_pwd" ]; then
        msgbox "两次输入不一致！"
        return 1
    fi

    # 构建 mysql 命令
    local mysql_cmd="mysql -u root"
    if [ -n "$current_pwd" ]; then
        mysql_cmd+=" --password='$current_pwd'"
    fi

    # 尝试修改密码
    local alter_sql="ALTER USER 'root'@'localhost' IDENTIFIED BY '$new_pwd'; FLUSH PRIVILEGES;"
    if eval "$mysql_cmd -e \"$alter_sql\"" 2>/tmp/mysql_alter_err; then
        rm -f /root/.mysql_temp_pass
        echo -e "${GREEN}密码修改成功！${NC}"
        return 0
    else
        local err=$(cat /tmp/mysql_alter_err)
        msgbox "密码修改失败，错误信息：\n$err"
        return 1
    fi
}

# ================= 安全加固 =================
secure_mysql() {
    echo -e "${YELLOW}执行 MySQL 安全加固...${NC}"
    local root_pwd=""
    if [ -f /root/.mysql_temp_pass ]; then
        root_pwd=$(cat /root/.mysql_temp_pass)
    fi

    # 如果 root 密码为空，则先尝试无密码连接
    local mysql_cmd="mysql -u root"
    if [ -n "$root_pwd" ]; then
        mysql_cmd+=" --password='$root_pwd'"
    fi

    # 删除匿名用户
    eval "$mysql_cmd -e \"DELETE FROM mysql.user WHERE User='';\""
    # 删除远程 root 访问
    eval "$mysql_cmd -e \"DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');\""
    # 删除测试数据库
    eval "$mysql_cmd -e \"DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';\""
    # 刷新权限
    eval "$mysql_cmd -e \"FLUSH PRIVILEGES;\""
    echo -e "${GREEN}安全加固完成。${NC}"
}

# ================= 设置别名 =================
setup_alias() {
    local default_alias="mysqlstart"
    local alias_name=$(inputbox "请输入别名名称（用于快速启动）：" "$default_alias")
    [ $? -ne 0 ] && return
    [ -z "$alias_name" ] && alias_name="$default_alias"

    # 检查别名是否已存在
    if grep -q "^alias $alias_name=" ~/.bashrc 2>/dev/null; then
        if ! yesno "别名 '$alias_name' 已存在，是否覆盖？"; then
            msgbox "未修改。"
            return
        fi
        sed -i "/^alias $alias_name=/d" ~/.bashrc
    fi

    # 优先使用服务启动，回退手动
    echo "alias $alias_name='service mysql start || mysqld --user=root &'" >> ~/.bashrc
    alias "$alias_name"='service mysql start || mysqld --user=root &' 2>/dev/null || true
    msgbox "别名设置成功！\n现在输入 '$alias_name' 即可启动 MySQL。\n\n若当前会话未生效，请执行 source ~/.bashrc"
}

# ================= 依赖检查通用函数 =================
check_and_install_deps() {
    local deps=("$@")
    local to_install=()
    for pkg in "${deps[@]}"; do
        if ! dpkg -s "$pkg" &>/dev/null; then
            to_install+=("$pkg")
        fi
    done

    if [ ${#to_install[@]} -gt 0 ]; then
        echo -e "${YELLOW}安装依赖: ${to_install[*]}${NC}"
        apt update
        apt install -y "${to_install[@]}"
    else
        echo -e "${GREEN}所有依赖已安装。${NC}"
    fi
}

# ================= 安装 Adminer =================
install_adminer() {
    msgbox "即将安装 Adminer（轻量级 MySQL 管理工具）"
    check_and_install_deps nginx php-fpm php-mysql curl wget

    PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;")
    PHP_SOCK="/var/run/php/php${PHP_VERSION}-fpm.sock"
    if [ ! -S "$PHP_SOCK" ]; then
        PHP_SOCK=$(find /var/run/php/ -name "*.sock" | head -1)
        if [ -z "$PHP_SOCK" ]; then
            msgbox "无法自动找到 PHP-FPM socket，请手动指定。"
            PHP_SOCK=$(inputbox "请输入 PHP-FPM socket 路径：" "/var/run/php/php8.1-fpm.sock")
        fi
    fi

    WEB_ROOT="/var/www/adminer"
    mkdir -p "$WEB_ROOT"
    ADMINER_URL="https://github.com/vrana/adminer/releases/download/v5.4.2/adminer-5.4.2.php"
    curl -L -o "$WEB_ROOT/index.php" "$ADMINER_URL" || wget -O "$WEB_ROOT/index.php" "$ADMINER_URL"

    NGINX_CONF="/etc/nginx/sites-available/adminer"
    cat > "$NGINX_CONF" <<EOF
server {
    listen 8080;
    server_name _;
    root $WEB_ROOT;
    index index.php;
    location / {
        try_files \$uri \$uri/ =404;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:$PHP_SOCK;
    }
}
EOF

    ln -sf "$NGINX_CONF" /etc/nginx/sites-enabled/
    if nginx -t; then
        systemctl reload nginx 2>/dev/null || service nginx reload 2>/dev/null || nginx -s reload
    else
        msgbox "Nginx 配置测试失败，请检查配置。"
        return 1
    fi

    systemctl start php${PHP_VERSION}-fpm 2>/dev/null || service php${PHP_VERSION}-fpm start 2>/dev/null || {
        msgbox "PHP-FPM 启动失败，请手动启动。"
    }

    msgbox "Adminer 安装成功！\n访问地址：http://localhost:8080\n使用 MySQL root 账号登录。"
}

# ================= 安装 phpMyAdmin =================
install_phpmyadmin() {
    msgbox "即将安装 phpMyAdmin（功能全面的 MySQL 管理工具）"
    check_and_install_deps nginx php-fpm php-mysql curl wget

    echo "phpmyadmin phpmyadmin/dbconfig-install boolean false" | debconf-set-selections
    echo "phpmyadmin phpmyadmin/reconfigure-webserver multiselect none" | debconf-set-selections
    if [ -f /root/.mysql_temp_pass ]; then
        local root_pwd=$(cat /root/.mysql_temp_pass)
        [ -n "$root_pwd" ] && echo "phpmyadmin phpmyadmin/mysql/admin-pass password $root_pwd" | debconf-set-selections 2>/dev/null || true
    fi

    apt install -y --no-install-recommends phpmyadmin

    PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;")
    PHP_SOCK="/var/run/php/php${PHP_VERSION}-fpm.sock"
    if [ ! -S "$PHP_SOCK" ]; then
        PHP_SOCK=$(find /var/run/php/ -name "*.sock" | head -1)
        if [ -z "$PHP_SOCK" ]; then
            msgbox "无法自动找到 PHP-FPM socket，请手动指定。"
            PHP_SOCK=$(inputbox "请输入 PHP-FPM socket 路径：" "/var/run/php/php8.1-fpm.sock")
        fi
    fi

    NGINX_CONF="/etc/nginx/sites-available/phpmyadmin"
    cat > "$NGINX_CONF" <<EOF
server {
    listen 8081;
    server_name _;
    root /usr/share/phpmyadmin;
    index index.php;
    location / {
        try_files \$uri \$uri/ =404;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:$PHP_SOCK;
    }
}
EOF

    ln -sf "$NGINX_CONF" /etc/nginx/sites-enabled/
    if nginx -t; then
        systemctl reload nginx 2>/dev/null || service nginx reload 2>/dev/null || nginx -s reload
    else
        msgbox "Nginx 配置测试失败，请检查配置。"
        return 1
    fi

    systemctl start php${PHP_VERSION}-fpm 2>/dev/null || service php${PHP_VERSION}-fpm start 2>/dev/null || {
        msgbox "PHP-FPM 启动失败，请手动启动。"
    }

    msgbox "phpMyAdmin 安装成功！\n访问地址：http://localhost:8081\n使用 MySQL root 账号登录。"
}

# ================= 安装完整 Web 环境 =================
install_web_environment() {
    msgbox "即将安装完整 Web 环境：\n- Nginx\n- PHP 8.x + 常用扩展\n- Node.js (可选版本)\n- MySQL (若未安装)"

    # 1. 安装 Nginx 和 PHP 基础
    check_and_install_deps nginx php-fpm php-mysql curl wget

    # 2. 安装 PHP 常用扩展
    PHP_EXTENSIONS="php-curl php-gd php-mbstring php-xml php-zip php-json php-mysqli php-pdo-mysql php-intl php-bcmath"
    check_and_install_deps $PHP_EXTENSIONS

    # 3. 安装 Node.js
    if command -v node &> /dev/null; then
        msgbox "Node.js 已安装，版本：$(node -v)"
    else
        local node_choice=$(whiptail --title "选择 Node.js 版本" --menu "请选择要安装的版本：" 12 60 2 \
            "lts" "长期支持版 (推荐)" \
            "current" "最新版" 3>&1 1>&2 2>&3)
        if [ $? -eq 0 ]; then
            echo -e "${YELLOW}安装 Node.js $node_choice ...${NC}"
            curl -fsSL "https://deb.nodesource.com/setup_${node_choice}.x" | bash -
            apt install -y nodejs
        else
            msgbox "未选择，跳过 Node.js 安装。"
        fi
    fi

    # 4. 检查 MySQL 是否已安装
    if ! command -v mysql &> /dev/null; then
        if yesno "MySQL 未安装，是否现在安装？"; then
            select_mysql_version
            configure_performance
            install_mysql
            init_database
            start_mysql
            if yesno "是否立即修改 root 密码？"; then
                change_password
            fi
            if yesno "是否执行安全加固？"; then
                secure_mysql
            fi
        else
            msgbox "跳过 MySQL 安装，请自行配置数据库。"
        fi
    else
        msgbox "MySQL 已安装，跳过。"
    fi

    # 5. 重启 PHP-FPM 和 Nginx
    PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;")
    systemctl restart php${PHP_VERSION}-fpm 2>/dev/null || service php${PHP_VERSION}-fpm restart 2>/dev/null || php-fpm${PHP_VERSION} --nodaemonize &
    if nginx -t; then
        systemctl reload nginx 2>/dev/null || service nginx reload 2>/dev/null || nginx -s reload
    else
        msgbox "Nginx 配置测试失败，请检查配置。"
    fi

    msgbox "Web 环境安装完成！\n- Nginx 已启动\n- PHP $(php -v | head -1) 已启动\n- Node.js $(node -v 2>/dev/null || echo '未安装') 已安装\n- MySQL 状态：$(pgrep mysqld >/dev/null && echo '运行中' || echo '未运行')"
}

# ================= 卸载功能 =================
uninstall_mysql() {
    if ! yesno "确定要完全卸载 MySQL 吗？所有数据将被删除！"; then
        return
    fi
    echo -e "${YELLOW}停止 MySQL 服务...${NC}"
    systemctl stop mysql 2>/dev/null || service mysql stop 2>/dev/null || pkill mysqld
    echo -e "${YELLOW}卸载软件包...${NC}"
    apt purge -y mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
    echo -e "${YELLOW}删除数据目录...${NC}"
    rm -rf /var/lib/mysql /etc/mysql /var/log/mysql /var/run/mysqld
    echo -e "${YELLOW}清理残留配置...${NC}"
    rm -f /etc/apt/sources.list.d/mysql.list
    rm -f /usr/share/keyrings/*mysql*.gpg
    rm -f /etc/apt/trusted.gpg.d/*mysql*.gpg
    apt update
    msgbox "MySQL 已完全卸载。"
}

# ================= 安装管理工具主菜单 =================
install_management_tool() {
    local choice
    choice=$(whiptail --title "安装 MySQL 管理工具" --menu "请选择要安装的工具：" 12 60 2 \
        "1" "Adminer（轻量、单文件）" \
        "2" "phpMyAdmin（功能全面）" 3>&1 1>&2 2>&3 || echo "")
    
    case $choice in
        1)
            install_adminer
            ;;
        2)
            install_phpmyadmin
            ;;
        *)
            msgbox "未选择，返回主菜单。"
            ;;
    esac
}

# ================= 主菜单 =================
main_menu() {
    while true; do
        local choice
        set +e
        choice=$(whiptail --title "MySQL 安装助手" --menu "请选择操作：" 24 70 13 \
            "1" "完整安装（版本选择 → 安装 → 初始化 → 启动 → 安全加固）" \
            "2" "选择 MySQL 版本" \
            "3" "安装 MySQL" \
            "4" "初始化数据库" \
            "5" "启动 MySQL" \
            "6" "修改 root 密码" \
            "7" "自动修复" \
            "8" "设置启动别名" \
            "9" "安全加固" \
            "10" "安装 MySQL 管理工具" \
            "11" "安装完整 Web 环境" \
            "12" "卸载 MySQL" \
            "13" "退出" 3>&1 1>&2 2>&3)
        local ret=$?
        set -e

        if [ $ret -ne 0 ]; then
            break
        fi

        case $choice in
            1)
                select_mysql_version
                configure_performance
                if install_mysql; then
                    if init_database; then
                        start_mysql
                        if yesno "是否立即修改 root 密码？"; then
                            change_password
                        fi
                        if yesno "是否执行安全加固？"; then
                            secure_mysql
                        fi
                        if yesno "是否设置启动别名？"; then
                            setup_alias
                        fi
                    fi
                fi
                ;;
            2)
                select_mysql_version
                ;;
            3)
                configure_performance
                install_mysql
                ;;
            4)
                init_database
                ;;
            5)
                start_mysql
                ;;
            6)
                change_password
                ;;
            7)
                fix_common_issues
                ;;
            8)
                setup_alias
                ;;
            9)
                secure_mysql
                ;;
            10)
                install_management_tool
                ;;
            11)
                install_web_environment
                ;;
            12)
                uninstall_mysql
                ;;
            13)
                break
                ;;
            *)
                break
                ;;
        esac
    done
}

# ================= 启动前检查 =================
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}请以 root 权限运行（在 Proot 中通常已是 root）。${NC}"
    exit 1
fi

# 安装基础依赖
install_base_deps

# 进入主菜单
main_menu
echo -e "${GREEN}脚本结束。日志保存在 $LOG_FILE${NC}"