#!/bin/bash
# ================================================
# XanMod 官方内核自动安装脚本（BBRv3 内置）- 官方文档优化版 v6
# 严格遵循 https://xanmod.org/ 2026年4月最新官方文档
# 主要优化：完美支持 Debian bookworm oldstable（强制 LTS 分支）
# ================================================
set -e

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

print_step() { echo -e "${BLUE}🔹 步骤 $1：${NC} $2"; }
print_success() { echo -e "${GREEN}✅ $1${NC}"; }
print_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
print_error() { echo -e "${RED}❌ $1${NC}"; }

# Y/n 交互（默认回车 = Y）
ask_yes_no() {
    local prompt="$1"
    local choice
    while true; do
        read -r -p "$prompt [Y/n]: " choice
        choice="${choice:-Y}"
        case "$choice" in
            [yY]|[yY][eE][sS]) return 0 ;;
            [nN]|[nN][oO]) return 1 ;;
            *) echo -e "${RED}无效输入，请输入 y 或 n${NC}" ;;
        esac
    done
}

echo -e "${BLUE}============================================================${NC}"
echo -e "${GREEN}🚀 XanMod 官方内核自动安装脚本（BBRv3 内置）- 官方文档优化版 v6${NC}"
echo -e "${BLUE}============================================================${NC}"

# 1. 检查 root
if [[ $EUID -ne 0 ]]; then
    print_error "请使用 root 权限运行（sudo -i 或 su -）"
    exit 1
fi

# 2. 检查必要依赖
print_step 0 "检查必要依赖（wget + gnupg + lsb-release）..."
MISSING_PKGS=()
for pkg in wget gnupg lsb-release; do
    if ! dpkg -s "$pkg" >/dev/null 2>&1; then
        MISSING_PKGS+=("$pkg")
    fi
done
if [[ ${#MISSING_PKGS[@]} -gt 0 ]]; then
    echo -e "检测到缺失依赖：${YELLOW}${MISSING_PKGS[*]}${NC}"
    apt update -qq
    apt install -y "${MISSING_PKGS[@]}"
    print_success "必要依赖已安装完成"
else
    print_success "所有必要依赖已存在，无需安装"
fi

# 3. 系统检测
DISTRO=$(lsb_release -is)
CODENAME=$(lsb_release -sc)
ARCH=$(uname -m)
echo -e "检测到系统：${GREEN}$DISTRO $CODENAME${NC} (${ARCH})"

SUPPORTED_CODENAMES=("bookworm" "trixie" "forky" "sid" "noble" "plucky" "questing" "resolute" "faye" "gigi" "wilma" "xia" "zara" "zena")
if [[ "$ARCH" != "x86_64" ]]; then
    print_error "本脚本仅支持 x86_64 架构"
    exit 1
fi
if [[ "$DISTRO" != "Debian" && "$DISTRO" != "Ubuntu" ]]; then
    print_error "本脚本仅支持 Debian / Ubuntu 系统"
    exit 1
fi
if [[ ! " ${SUPPORTED_CODENAMES[*]} " =~ " ${CODENAME} " ]]; then
    print_error "当前系统 $DISTRO $CODENAME 不受 XanMod 官方支持！"
    echo -e "${YELLOW}官方支持 codename：${NC}bookworm trixie forky sid noble plucky questing resolute faye gigi wilma xia zara zena"
    exit 1
fi
print_success "系统检查通过（官方支持）"

if ! ask_yes_no "👉 环境检查通过，是否继续检测 CPU 并准备安装？"; then
    echo -e "${YELLOW}⛔ 已取消安装。${NC}"
    exit 0
fi

# 4. CPU 检测 + 分支选择（v6 核心优化）
print_step 1 "正在检测 CPU 指令集支持级别..."
cat > /tmp/check_x86-64_psabi.awk << 'EOF'
#!/usr/bin/awk -f
BEGIN {
    while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1
    if (/lm/&&/cmov/&&/cx8/&&/fpu/&&/fxsr/&&/mmx/&&/syscall/&&/sse2/) level = 1
    if (level == 1 && /cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/) level = 2
    if (level == 2 && /avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/) level = 3
    if (level == 3 && /avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/) level = 4
    if (level > 0) { print "CPU supports x86-64-v" level; exit level + 1 }
    exit 1
}
EOF
chmod +x /tmp/check_x86-64_psabi.awk
set +e
/tmp/check_x86-64_psabi.awk
AWK_RET=$?
set -e
if [[ $AWK_RET -eq 1 ]]; then
    print_error "无法识别当前 CPU 支持的 x86-64 级别。"
    rm -f /tmp/check_x86-64_psabi.awk
    exit 1
fi
LEVEL=$((AWK_RET - 1))

# v6 官方逻辑
if [[ $LEVEL -eq 1 ]]; then
    PKG_PREFIX="lts"
    VARIANT=1
    print_success "目标内核变体：linux-xanmod-lts-x64v1 （v1 CPU 必须使用 LTS 分支）"
elif [[ $LEVEL -ge 4 ]]; then
    PKG_PREFIX=""
    VARIANT=3
    print_warning "检测到 CPU 支持 x86-64-v4 → 官方推荐使用 v3（v4 无实际收益）"
else
    PKG_PREFIX=""
    VARIANT=$LEVEL
    print_success "目标内核变体：linux-xanmod-x64v${VARIANT}"
fi

# 官方强制规则：Debian bookworm (oldstable) 仅支持 LTS 分支
if [[ "$CODENAME" == "bookworm" ]]; then
    PKG_PREFIX="lts"
    print_warning "Debian bookworm 为 oldstable，仅支持 LTS 分支 → 强制使用 linux-xanmod-lts-x64v${VARIANT}"
fi

if ! ask_yes_no "👉 是否确认安装 linux-xanmod-${PKG_PREFIX:+$PKG_PREFIX-}x64v${VARIANT}？"; then
    echo -e "${YELLOW}⛔ 用户取消安装。${NC}"
    rm -f /tmp/check_x86-64_psabi.awk
    exit 0
fi

# 5. 官方安装流程（完全按 xanmod.org 文档）
print_step 2 "创建密钥目录..."
mkdir -p /etc/apt/keyrings

print_step 3 "导入 XanMod 官方 GPG 密钥..."
wget -qO - https://dl.xanmod.org/archive.key | gpg --dearmor -vo /etc/apt/keyrings/xanmod-archive-keyring.gpg

print_step 4 "添加官方 APT 源..."
echo "deb [signed-by=/etc/apt/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org ${CODENAME} main" \
    | tee /etc/apt/sources.list.d/xanmod-release.list > /dev/null

print_step 5 "更新软件源并安装内核..."
apt update -qq
apt install -y "linux-xanmod-${PKG_PREFIX:+$PKG_PREFIX-}x64v${VARIANT}"

# 可选安装 headers
if ask_yes_no "👉 是否同时安装 linux-headers-xanmod-${PKG_PREFIX:+$PKG_PREFIX-}x64v${VARIANT}？（推荐用于 NVIDIA / VirtualBox / DKMS）"; then
    apt install -y "linux-headers-xanmod-${PKG_PREFIX:+$PKG_PREFIX-}x64v${VARIANT}"
    print_success "linux-headers 已安装"
else
    print_warning "已跳过 headers 安装（以后需要可手动安装）"
fi

rm -f /tmp/check_x86-64_psabi.awk

echo -e "${GREEN}"
echo "============================================================="
echo "🎉 XanMod 内核（x64v${VARIANT} + BBRv3）安装完成！"
echo "=============================================================${NC}"
echo -e "BBRv3 已默认启用，无需额外配置。"
echo ""
echo -e "${BLUE}验证命令：${NC}"
echo " uname -r"
echo " sysctl net.ipv4.tcp_congestion_control"
echo " modinfo tcp_bbr | grep -E 'version|filename|description|author'"
echo ""
echo -e "${YELLOW}新内核需要重启才能生效${NC}"
if ask_yes_no "👉 是否立即重启系统？"; then
    echo -e "${GREEN}🔄 正在重启...${NC}"
    reboot
else
    echo -e "${YELLOW}ℹ️ 请稍后手动执行 sudo reboot${NC}"
fi
