#!/usr/bin/env bash

# 脚本名称
SCRIPT_NAME="2_安装配置Docker.sh"
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 全局变量
MIRRORS=(
    "https://mirrors.aliyun.com/docker-ce"
    "https://mirrors.tencent.com/docker-ce"
    "https://mirrors.cloud.tencent.com/docker-ce"
)
# 镜像加速源 (用于 daemon.json)
ACCELERATORS=(
    "https://docker.m.daocloud.io"
    "https://hub-mirror.c.163.com"
    "https://mirror.baidubce.com"
    "https://dockerproxy.com"
)
SELECTED_MIRROR=""
INSTALLED_VERSION=""

# --- 日志函数 ---
log_msg() {
    local level=$1
    local msg=$2
    local color=$NC
    case "$level" in
        "INFO") color=$BLUE ;;
        "SUCCESS") color=$GREEN ;;
        "WARNING") color=$YELLOW ;;
        "ERROR") color=$RED ;;
    esac
    echo -e "${color}[$level]${NC} $msg"
}

# --- 核心逻辑 ---

# 1. 检测系统类型
detect_os() {
    log_msg "INFO" "正在检测操作系统类型..."
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
        VERSION_ID=$VERSION_ID
        log_msg "INFO" "检测到系统: $OS $VERSION_ID"
    else
        log_msg "ERROR" "无法识别操作系统，脚本退出。"
        exit 1
    fi
}

# 2. 测试镜像源速度并选择最快的
select_fastest_mirror() {
    log_msg "INFO" "正在测试国内镜像源速度..."
    local best_url=""
    local min_time=999

    for mirror in "${MIRRORS[@]}"; do
        # 简单的测速逻辑：尝试下载 release 文件头，看耗时
        # 使用 curl -o /dev/null -s -w '%{time_total}' 来获取时间
        local url="${mirror}/linux/${OS}/gpg"
        # 这里的测速只是简单尝试连接，实际安装时会用选中的源

        # 模拟测速结果 (实际项目中建议用 curl 真实测速，这里为了脚本稳定性简化处理)
        # 优先使用阿里云，如果失败则尝试腾讯云
        if curl --connect-timeout 3 -s -o /dev/null -w "%{http_code}" "$url" | grep -q "200"; then
            best_url="$mirror"
            log_msg "SUCCESS" "发现可用镜像源: $mirror"
            break # 找到第一个能用的就停止，或者可以遍历完找最快的
        fi
    done

    if [ -z "$best_url" ]; then
        log_msg "WARNING" "所有预设镜像源均不可用，将尝试使用官方源（可能较慢）。"
        SELECTED_MIRROR="official"
    else
        SELECTED_MIRROR="$best_url"
    fi
}

# 3. 安装 Docker (根据系统分发)
install_docker() {
    log_msg "INFO" "开始安装 Docker CE..."

    # 卸载旧版本
    if command -v docker &> /dev/null; then
        log_msg "INFO" "检测到已安装 Docker，尝试移除..."
        yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine || apt-get remove -y docker.io docker-doc docker-compose podman-docker containerd runc
    fi

    if [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then
        install_docker_centos
    elif [[ "$OS" == "ubuntu" || "$OS" == "debian" ]]; then
        install_docker_ubuntu
    else
        log_msg "ERROR" "不支持的系统类型: $OS"
        exit 1
    fi
}

install_docker_centos() {
    log_msg "INFO" "执行 CentOS/RHEL 安装流程..."

    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2

    # 添加仓库
    if [ "$SELECTED_MIRROR" == "official" ]; then
        yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    else
        # 使用国内源 (注意：腾讯云和阿里云的repo路径略有不同，这里以阿里云为例)
        yum-config-manager --add-repo ${SELECTED_MIRROR}/linux/centos/docker-ce.repo
    fi

    # 安装
    yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

    # 启动
    systemctl enable docker
    systemctl start docker
}

install_docker_ubuntu() {
    log_msg "INFO" "执行 Ubuntu/Debian 安装流程..."

    # 安装依赖
    apt-get update
    apt-get install -y ca-certificates curl gnupg lsb-release

    # 添加 GPG 密钥
    mkdir -p /etc/apt/keyrings
    if [ "$SELECTED_MIRROR" == "official" ]; then
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    else
        curl -fsSL ${SELECTED_MIRROR}/linux/${OS}/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    fi

    # 添加仓库
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] ${SELECTED_MIRROR}/linux/${OS} \
      $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

    # 安装
    apt-get update
    apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

    # 启动
    systemctl enable docker
    systemctl start docker
}

# 4. 配置镜像加速器
setup_accelerator() {
    log_msg "INFO" "正在配置 Docker 镜像加速器..."

    mkdir -p /etc/docker

    # 构建 JSON 内容
    local json_content="{\n  \"registry-mirrors\": ["

    # 简单拼接加速源
    for acc in "${ACCELERATORS[@]}"; do
        json_content+="\n    \"$acc\","
    done
    # 去掉最后一个逗号
    json_content="${json_content%,}"
    json_content+="\n  ]\n}"

    # 写入文件
    echo -e "$json_content" > /etc/docker/daemon.json

    # 重启生效
    systemctl daemon-reload
    systemctl restart docker

    log_msg "SUCCESS" "镜像加速器配置完成。"
}

# 5. 验证安装
verify_installation() {
    log_msg "INFO" "正在验证安装结果..."

    if command -v docker &> /dev/null; then
        local version=$(docker --version)
        log_msg "SUCCESS" "Docker 安装成功: $version"

        # 运行 Hello World
        log_msg "INFO" "正在拉取测试镜像 hello-world..."
        if docker run --rm hello-world 2>&1 | grep -q "Hello from Docker!"; then
            log_msg "SUCCESS" "Docker 容器运行测试通过！"
        else
            log_msg "WARNING" "Docker 守护进程运行正常，但无法拉取 hello-world 镜像（可能是加速器配置未生效或网络波动）。"
        fi
    else
        log_msg "ERROR" "Docker 命令未找到，安装似乎失败。"
        return 1
    fi
}

# 6. 回滚机制
rollback() {
    log_msg "ROLLBACK" "检测到安装失败，正在执行回滚..."

    if [[ "$OS" == "centos" || "$OS" == "rhel" ]]; then
        yum remove -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
        rm -f /etc/yum.repos.d/docker-ce.repo
    else
        apt-get remove -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
        rm -f /etc/apt/sources.list.d/docker.list
        rm -f /etc/apt/keyrings/docker.gpg
    fi

    # 清理配置
    rm -rf /etc/docker

    log_msg "ROLLBACK" "回滚完成，已卸载 Docker 相关组件。"
}

# --- 主程序 ---
main() {
    log_msg "INFO" "========================================"
    log_msg "INFO" "开始执行 Docker 自动化安装脚本"
    log_msg "INFO" "========================================"

    # 检查 Root 权限
    if [ "$(id -u)" -ne 0 ]; then
        log_msg "ERROR" "请使用 Root 权限运行此脚本"
        exit 1
    fi

    # 捕获错误执行回滚
    trap rollback ERR

    detect_os
    select_fastest_mirror
    install_docker
    setup_accelerator

    # 移除错误捕获，因为验证阶段失败不需要回滚（已经装好了）
    trap - ERR

    verify_installation

    log_msg "INFO" "========================================"
    log_msg "SUCCESS" "Docker 部署全部完成！"
    log_msg "INFO" "========================================"
}

main

