#!/bin/bash

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

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

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

# 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)..."
        # 尝试使用国内镜像源的 GPG 密钥
        curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || \
        curl -fsSL https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || {
            echo "❌ 无法获取 Docker GPG 密钥。请检查网络或尝试手动下载。"
            exit 1
        }
        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] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
          $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null || {
            echo "❌ 无法添加 Docker 国内镜像源。请检查网络或源地址。"
            exit 1
          }

        sudo apt-get update -y

        echo "🐳 安装 Docker (Ubuntu)..."
        # 安装推荐的 Docker CE 相关组件，包括 docker-buildx-plugin 和 docker-compose-plugin
        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)..."
        # 备份原有 repo 文件
        if [ -f "/etc/yum.repos.d/docker-ce.repo" ]; then
            echo "🔄 备份原有 Docker CE repo 文件..."
            sudo mv /etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/docker-ce.repo.bak
        fi

        # 尝试配置阿里云镜像源
        echo "尝试配置阿里云 Docker CE 镜像源..."
        sudo tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
enabled=1
EOF

        # 禁用默认的 container-tools 模块 (CentOS 8+)
        if [[ "$OS_VERSION" -ge "8" ]]; then
            echo "⚙️ 禁用 CentOS 8+ 默认的 container-tools 模块以避免冲突..."
            sudo yum module disable -y container-tools || true # 允许失败，某些系统可能没有此模块
            sudo yum module enable -y container-tools:docker || true # 允许失败
        fi

        echo "🐳 安装 Docker (CentOS)..."
        # 尝试安装 Docker CE 及其组件，包括 buildx 插件和 compose 插件
        sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || {
            echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试更换国内镜像源。"
            echo "例如，您可以编辑 /etc/yum.repos.d/docker-ce.repo 将 baseurl 更改为其他镜像站，如清华大学："
            echo "   https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/\$releasever/\$basearch/stable"
            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-compose-plugin &> /dev/null; then
    echo "✅ Docker Compose (插件版) 已安装，跳过安装步骤"
elif command -v docker-compose &> /dev/null; then
    echo "⚠️ 检测到旧版 Docker Compose 独立安装。为保持最新兼容性，推荐使用 Docker Compose 插件版。"
    echo "如果您希望继续使用旧版，可以忽略此提示。"
    echo "如果需要安装插件版，请先卸载旧版或手动安装 docker-compose-plugin。"
else
    echo "⚙️ 安装 Docker Compose (插件版)..."
    # 尝试安装 docker-compose-plugin，它通常随 docker-ce 一起安装
    if [[ "$OS_FAMILY" == "Ubuntu" ]]; then
        sudo apt-get install -y docker-compose-plugin || {
            echo "❌ 无法安装 docker-compose-plugin。请检查您的 APT 源或网络。"
            exit 1
        }
    elif [[ "$OS_FAMILY" == "CentOS" ]]; then
        sudo yum install -y docker-compose-plugin || {
            echo "❌ 无法安装 docker-compose-plugin。请检查您的 YUM 源或网络。"
            exit 1
        }
    else
        echo "❌ 未知操作系统，无法安装 Docker Compose 插件版。"
        exit 1
    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应用启动成功"