#!/bin/bash

set -e  # 发生错误时终止脚本执行

echo "==========================="
echo "🚀 开始自动安装 Docker 和 Docker Compose"
echo "==========================="

# 获取操作系统类型和版本
OS_FAMILY=$(hostnamectl | grep "Operating System" | awk '{print $3}')
OS_VERSION_ID=$(grep -oP '(?<=^VERSION_ID=")[0-9.]+' /etc/os-release | cut -d'.' -f1)
OS_CODENAME=""
if [[ "$OS_FAMILY" == "Ubuntu" ]]; then
    OS_CODENAME=$(lsb_release -cs)
fi

# 定义国内镜像源
# Ubuntu 镜像源
UBUNTU_DOCKER_MIRROR_URL="https://mirrors.ustc.edu.cn/docker-ce" # 中科大
UBUNTU_DOCKER_GPG_URL="https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg"

# CentOS 镜像源 (选择一个即可，这里提供清华和阿里云)
CENTOS_DOCKER_MIRROR_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce" # 清华大学
# CENTOS_DOCKER_MIRROR_URL="https://mirrors.aliyun.com/docker-ce" # 阿里云 - 如果清华源不稳定可以尝试这个

# 函数：检查并等待网络连接
check_network() {
    echo "🌐 检查网络连接到 Docker 官方仓库 (备用)..."
    if curl -sSf https://download.docker.com/ &> /dev/null; then
        echo "✅ 网络连接到 Docker 官方仓库正常。"
        return 0
    else
        echo "⚠️ 无法连接到 Docker 官方仓库。将尝试使用国内镜像源。"
        # 即使无法连接官方源，也继续尝试国内源
        return 0
    fi
}

# 预检网络连接（非阻塞，仅作为提示）
check_network

# Docker 安装
if command -v docker &> /dev/null; then
    echo "✅ Docker 已安装，跳过安装步骤"
else
    if [[ "$OS_FAMILY" == "Ubuntu" ]]; then
        echo "📦 安装依赖 (Ubuntu)..."
        sudo apt update -y
        sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

        echo "🔑 添加 Docker GPG 密钥 (Ubuntu) - 优先使用国内镜像源..."
        # 现代 Ubuntu 推荐使用 gpg --dearmor
        sudo install -m 0755 -d /etc/apt/keyrings
        if ! curl -fsSL "$UBUNTU_DOCKER_GPG_URL" | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg; then
            echo "❌ 无法从国内镜像源获取 GPG 密钥，尝试从官方源获取..."
            curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || {
                echo "❌ 无法获取 Docker GPG 密钥，请检查网络或 GPG 密钥 URL。"
                exit 1
            }
        fi
        sudo chmod a+r /etc/apt/keyrings/docker.gpg # 确保可读权限

        echo "🌍 添加 Docker 源 (Ubuntu) - 使用国内镜像源..."
        echo \
          "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $UBUNTU_DOCKER_MIRROR_URL/linux/ubuntu \
          $OS_CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt-get update -y

        echo "🐳 安装 Docker (Ubuntu)..."
        sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || {
            echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试手动安装。"
            exit 1
        }

    elif [[ "$OS_FAMILY" == "CentOS" ]]; then
        echo "📦 安装依赖 (CentOS)..."
        sudo yum install -y yum-utils device-mapper-persistent-data lvm2

        echo "🌍 添加 Docker 源 (CentOS) - 使用国内镜像源..."
        # 添加 Docker CE 官方 repo
        sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

        # 替换为国内镜像源
        echo "🔄 替换 Docker 源为国内镜像 ($CENTOS_DOCKER_MIRROR_URL)..."
        sudo sed -i "s+https://download.docker.com+$CENTOS_DOCKER_MIRROR_URL+" /etc/yum.repos.d/docker-ce.repo || {
            echo "❌ 替换 Docker 源失败，可能 repo 文件路径不正确或无权限。"
            exit 1
        }

        # CentOS 8+ 可能会遇到 module 冲突，禁用默认的 container-tools 模块
        if [[ "$OS_VERSION_ID" -ge "8" ]]; then
            echo "⚙️ 禁用 CentOS 8+ 默认的 container-tools 模块以避免冲突..."
            sudo yum module disable -y container-tools
            sudo yum module enable -y container-tools:docker
        fi
        sudo yum makecache

        echo "🐳 安装 Docker (CentOS)..."
        sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || {
            echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试手动安装。"
            echo "提示：如果仍遇到下载问题，请检查网络、防火墙或尝试切换另一个国内镜像源。"
            exit 1
        }

    else
        echo "❌ 未知操作系统 ($OS_FAMILY)，无法安装 Docker。"
        exit 1
    fi

    echo "✅ 启动并设置 Docker 开机自启..."
    sudo systemctl enable docker
    sudo systemctl start docker

    # 将当前用户添加到 docker 组，以便无需 sudo 运行 Docker 命令
    if ! getent group docker | grep -qw "$USER"; then
        echo "👥 将当前用户 ($USER) 添加到 docker 组..."
        sudo usermod -aG docker "$USER"
        echo "🔔 请注销并重新登录，以便更改生效。"
    fi
fi

# Docker Compose 检查和安装 (优先使用 docker-compose-plugin)
if command -v docker &> /dev/null && docker compose version &> /dev/null; then
    echo "✅ Docker Compose (插件版) 已安装，跳过安装步骤"
elif command -v docker-compose &> /dev/null && ! command -v docker &> /dev/null; then
    echo "⚠️ 检测到旧版 Docker Compose 独立安装，但未检测到 Docker 插件版。"
    echo "建议在安装 Docker CE 时一起安装 docker-compose-plugin。"
else
    echo "⚙️ 安装 Docker Compose (插件版)..."
    PLUGIN_INSTALL_SUCCESS=1

    # 如果 Docker CE 安装成功，docker-compose-plugin 应该已经安装了。
    # 这里是额外的检查，以防万一。
    if [[ "$OS_FAMILY" == "Ubuntu" ]]; then
        sudo apt-get install -y docker-compose-plugin || PLUGIN_INSTALL_SUCCESS=0
    elif [[ "$OS_FAMILY" == "CentOS" ]]; then
        sudo yum install -y docker-compose-plugin || PLUGIN_INSTALL_SUCCESS=0
    else
        echo "❌ 未知操作系统，无法安装 Docker Compose 插件版。"
        PLUGIN_INSTALL_SUCCESS=0
    fi

    # 检查插件版安装是否成功
    if [[ $PLUGIN_INSTALL_SUCCESS -eq 1 ]]; then
        echo "✅ Docker Compose 插件版安装成功"
    else
        echo "⚠️ Docker Compose 插件版安装失败，尝试使用本地二进制文件安装..."
        #将文件移动至/usr/bin目录下，并重命名
        sudo cp ./docker-compose-linux-x86_64 /usr/bin/docker-compose
        # 添加执行权限
        sudo chmod +x /usr/bin/docker-compose

        # 验证安装
        if command -v docker-compose &> /dev/null; then
            echo "✅ Docker Compose 二进制文件安装成功"
        else
            echo "❌ Docker Compose 二进制文件安装失败，请手动检查。"
            exit 1
        fi
    fi
fi


echo "📌 Docker 运行状态:"
sudo systemctl status docker --no-pager || true

echo "📌 Docker Compose 版本:"
# 优先使用 docker compose 命令（新版），如果不行再尝试 docker-compose（旧版或别名）
if command -v docker &> /dev/null && docker compose version &> /dev/null; then
    docker compose version
elif command -v docker-compose &> /dev/null; then
    docker-compose -v
else
    echo "❌ 无法检测 Docker Compose 版本。"
fi

echo "🎉 Docker 和 Docker Compose 已就绪！"

echo "🚀 启动EasyAI"
# 对于新版 docker-compose-plugin，命令是 'docker compose'
if command -v docker &> /dev/null && docker compose version &> /dev/null; then
    sudo docker compose pull && sudo docker compose up -d
else # 兼容旧版独立安装的 docker-compose
    sudo docker-compose pull && sudo docker-compose up -d
fi
echo "🎉EasyAI应用启动成功"