#!/usr/bin/env bash
set -Eeuo pipefail

# 定义颜色变量
RED='\033[0;31m'    # 错误/警告
GREEN='\033[0;32m'  # 成功/完成
YELLOW='\033[0;33m' # 提示/步骤
BLUE='\033[0;34m'   # 信息/标题
MAGENTA='\033[0;35m' # 小提示
CYAN='\033[0;36m'   # 重要步骤
NC='\033[0m'        # 重置颜色

echo -e "${BLUE}✨ 欢迎使用 Docker Debian 一键安装脚本！${NC}"
echo -e "${BLUE}本脚本将根据 Docker 官方文档，并结合您的网络环境，自动完成 Docker Engine 的安装及配置。${NC}"
echo -e "${BLUE}当前脚本将在 root 用户下执行。${NC}"
echo -e "${BLUE}--------------------------------------------------${NC}"

# 函数：检测网络连接到 Google 以判断国内外环境
check_google_connectivity() {
    echo -e "${YELLOW}🌐 正在尝试检测网络连接环境...${NC}"
    # 尝试访问 Google.com，5秒超时，只获取头部信息，不显示输出
    if curl -s --head --request GET -m 5 https://www.google.com > /dev/null 2>&1; then
        echo -e "${GREEN}✅ 成功连接到 Google.com，判断为国际网络环境。${NC}"
        return 0 # 国际环境
    else
        echo -e "${RED}❌ 无法连接到 Google.com (或连接超时)，判断为国内网络环境。${NC}"
        return 1 # 国内环境
    fi
}

# 根据网络检测结果设置环境标志
IS_DOMESTIC=false
if ! check_google_connectivity; then
    IS_DOMESTIC=true
fi
echo -e "${BLUE}--------------------------------------------------${NC}"

echo -e "${CYAN}🚀 第一步: 卸载可能冲突的旧版 Docker 包...${NC}"
# 遍历并尝试卸载所有可能与新版 Docker 冲突的软件包
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
    echo -e "${YELLOW}  正在尝试卸载: ${pkg}...${NC}"
    # 使用 -y 自动确认，|| true 确保即使包不存在或卸载失败也不中断脚本
    apt-get remove -y "$pkg" || true
done
echo -e "${GREEN}✅ 旧版 Docker 包卸载完成。${NC}"
echo -e "${BLUE}--------------------------------------------------${NC}"

echo -e "${CYAN}🛠️ 第二步: 设置 Docker 的 APT 仓库...${NC}"

echo -e "${YELLOW}  更新 APT 软件包列表并安装必要工具 (ca-certificates, curl, gnupg)...${NC}"
apt-get update
# 安装必要的依赖包。gnupg 对于处理 GPG 密钥是必需的
if ! apt-get install -y ca-certificates curl gnupg; then
    echo -e "${RED}🚨 错误: 安装必要依赖包失败。请检查网络连接或手动安装。${NC}"
    exit 1
fi
echo -e "${GREEN}✅ 必要工具安装完成。${NC}"

echo -e "${YELLOW}  创建 Docker GPG 密钥目录 (/etc/apt/keyrings) 并下载官方 GPG 密钥...${NC}"
# 创建存放 GPG 密钥的目录，设置合适的权限
install -m 0755 -d /etc/apt/keyrings

# 下载 Docker 官方 GPG 密钥并使用 gpg --dearmor 处理为 .gpg 文件
# 增加 --yes 选项，强制覆盖已存在的文件，避免交互式询问或管道中断
if curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor --batch --yes -o /etc/apt/keyrings/docker.gpg; then
    echo -e "${GREEN}    GPG 密钥下载并处理成功。${NC}"
else
    echo -e "${RED}🚨 错误: 下载或处理 Docker GPG 密钥失败。请检查网络连接。${NC}"; exit 1;
fi

# 设置 GPG 密钥文件的权限 (这里确保读权限)
chmod a+r /etc/apt/keyrings/docker.gpg
echo -e "${GREEN}✅ GPG 密钥添加完成。${NC}"

echo -e "${YELLOW}  添加 Docker APT 仓库到系统源列表...${NC}"
DOCKER_REPO_URL="https://download.docker.com/linux/debian"
if [ "$IS_DOMESTIC" = true ]; then
    DOCKER_REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian"
    echo -e "${YELLOW}    👉 检测到国内环境，将使用清华大学镜像源: ${DOCKER_REPO_URL}${NC}"
fi

# 使用新的 .gpg 文件作为签名源，并根据环境选择合适的仓库地址
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] ${DOCKER_REPO_URL} \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
    && echo -e "${GREEN}    Docker APT 仓库添加成功。${NC}" \
    || { echo -e "${RED}🚨 错误: 添加 Docker APT 仓库失败。${NC}"; exit 1; }

echo -e "${YELLOW}  再次更新 APT 软件包列表 (以便识别新的 Docker 仓库)...${NC}"
apt-get update
echo -e "${GREEN}✅ APT 软件包列表更新完成。${NC}"
echo -e "${BLUE}--------------------------------------------------${NC}"

echo -e "${CYAN}📦 第三步: 安装 Docker Engine、CLI、Containerd 及插件...${NC}"
# 安装 Docker Engine 的核心组件及推荐插件
if ! apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; then
    echo -e "${RED}🚨 错误: Docker 安装失败。请检查APT源配置或网络连接。${NC}"
    exit 1
fi
echo -e "${GREEN}🎉 Docker Engine 及相关组件安装成功！${NC}"
echo -e "${BLUE}--------------------------------------------------${NC}"

# 新增条件判断：只有在国内网络环境下才询问和配置镜像加速器
if [ "$IS_DOMESTIC" = true ]; then
    echo -e "${YELLOW}🤔 第四步: 配置 Docker 镜像加速器 (可选)${NC}"
    # 询问用户是否配置 Docker 镜像加速器
    read -p "$(echo -e "${YELLOW}您是否希望配置 Docker 镜像加速器以加速镜像下载？(y/N): ${NC}")" -n 1 -r
    echo # 换行以保证输出整洁

    if [[ $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${GREEN}  👍 好的，正在为您配置 Docker 镜像加速器...${NC}"
        mkdir -p /etc/docker
        # 使用 tee 将配置写入 daemon.json
        tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://hub.mirrorify.net"
    ]
}
EOF
        echo -e "${GREEN}  ✅ 镜像加速器配置已写入 /etc/docker/daemon.json${NC}"

        echo -e "${YELLOW}  🔄 重新加载 systemd 配置并重启 Docker 服务...${NC}"
        if systemctl daemon-reload && systemctl restart docker; then
            echo -e "${GREEN}    ✅ Docker 服务已成功重启，镜像加速器已生效。${NC}"
        else
            echo -e "${RED}🚨 错误: Docker 服务重启失败。请手动检查 Docker 状态 ('systemctl status docker')。${NC}"
        fi
    else
        echo -e "${YELLOW}  🙅‍ 跳过 Docker 镜像加速器配置。${NC}"
    fi
    echo -e "${BLUE}--------------------------------------------------${NC}"
else
    echo -e "${BLUE}--------------------------------------------------${NC}"
    echo -e "${YELLOW}🌐 检测到国际网络环境，跳过 Docker 镜像加速器配置。${NC}"
    echo -e "${BLUE}--------------------------------------------------${NC}"
fi

echo -e "${YELLOW}🤔 第五步: 配置 Docker 常用命令别名 (可选)${NC}"
read -p "$(echo -e "${YELLOW}您是否希望为 Docker 和 Docker Compose 配置常用别名 (d 和 dp)？(y/N): ${NC}")" -n 1 -r
echo # 换行以保证输出整洁

if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${GREEN}  👍 好的，正在为您配置常用别名...${NC}"
    # 将别名添加到 root 用户的 .bashrc 文件
    ALIAS_FILE="/root/.bashrc"
    {
        echo "" # 添加一个空行，保持文件整洁
        echo "# Docker Aliases added by Docker Installation Script"
        echo 'alias d="docker"'
        echo 'alias dp="docker compose"'
    } >> "$ALIAS_FILE"
    echo -e "${GREEN}  ✅ 别名 'd' (docker) 和 'dp' (docker compose) 已添加到 ${ALIAS_FILE}${NC}"
    echo -e "${MAGENTA}  请注意：要使别名在当前会话生效，您需要关闭并重新打开终端，或执行：${NC}"
    echo -e "${MAGENTA}    source ${ALIAS_FILE}${NC}"
    echo -e "${MAGENTA}  如果您是其他非 root 用户，且希望使用这些别名，请手动将以下行添加到您的 '~/.bashrc' 或 '~/.zshrc' 等shell配置文件中：${NC}"
    echo -e "${MAGENTA}    alias d=\"docker\"${NC}"
    echo -e "${MAGENTA}    alias dp=\"docker compose\"${NC}"
else
    echo -e "${YELLOW}  🙅‍ 跳过 Docker 常用命令别名配置。${NC}"
fi
echo -e "${BLUE}--------------------------------------------------${NC}"

echo -e "${BLUE}✨ 安装完成！您现在可以自行测试 Docker 是否正常工作。${NC}"
echo -e "${MAGENTA}💡 小提示:${NC}"
echo -e "${MAGENTA}  如果您希望非 root 用户也能运行 Docker，请在安装完成后执行以下命令，将您的用户添加到 'docker' 用户组:${NC}"
echo -e "${MAGENTA}  usermod -aG docker YOUR_USERNAME (请将 YOUR_USERNAME 替换为您的实际用户名)${NC}"
echo -e "${MAGENTA}  添加后请重新登录您的会话 (或重启电脑) 使更改生效。${NC}"
echo ""
echo -e "${BLUE}🚀 祝您使用 Docker 愉快！${NC}"

