#!/bin/bash

#===============================================================================
# 新机一键部署脚本: Docker + Dockge + AstrBot + NapCat
#
# 适用系统: Ubuntu 20.04+ / Debian 11+ / CentOS 7+ / Rocky 8+ / Fedora 35+
#
# 使用方法:
#   chmod +x deploy-astrbot-napcat.sh && sudo ./deploy-astrbot-napcat.sh
#
# 部署内容:
#   1. Docker Engine      - 容器运行时 (如未安装)
#   2. Docker Compose     - 容器编排工具 (如未安装)
#   3. Dockge             - Docker Compose 可视化管理面板 (:5001)
#   4. AstrBot + NapCat   - QQ 机器人 (使用官方 astrbot.yml 一体化部署)
#
# 部署完成后访问:
#   Dockge WebUI  : http://<服务器IP>:5001
#   AstrBot WebUI : http://<服务器IP>:6185   (默认账号 astrbot / 密码见启动日志)
#   NapCat WebUI  : http://<服务器IP>:6099   (Token 见启动日志)
#
# 参考文档:
#   Dockge  : https://github.com/louislam/dockge
#   AstrBot : https://docs.astrbot.app
#   NapCat  : https://napneko.github.io
#===============================================================================

set -euo pipefail

#-------------------------------------------------------------------------------
# 颜色与输出
#-------------------------------------------------------------------------------
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m'

info()  { echo -e "${GREEN}[INFO]${NC}  $1"; }
warn()  { echo -e "${YELLOW}[WARN]${NC}  $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step()  { echo -e "\n${BLUE}==>${NC} ${CYAN}$1${NC}"; }

#-------------------------------------------------------------------------------
# 默认配置
#-------------------------------------------------------------------------------
# Dockge 配置
DOCKGE_DIR="/opt/dockge"                                # Dockge 安装目录
DOCKGE_STACKS_DIR="/opt/stacks"                         # Dockge 管理的堆栈目录

# AstrBot+NapCat 配置 (使用官方 compose 文件)
ASTROBOT_DIR="${DOCKGE_STACKS_DIR}/astrbot"             # 放在 Dockge 堆栈目录下, 方便统一管理
ASTROBOT_COMPOSE_URL="https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml"

#-------------------------------------------------------------------------------
# 系统检测
#-------------------------------------------------------------------------------
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        OS_ID="${ID}"
        OS_NAME="${PRETTY_NAME:-${ID}}"
    else
        error "无法检测操作系统类型 (/etc/os-release 不存在)"
        exit 1
    fi

    # 归类到包管理器
    case "$OS_ID" in
        ubuntu|debian|deepin|uos)
            PKG_TYPE="apt"
            ;;
        centos|rhel|rocky|almalinux|fedora|openEuler|anolis)
            if command -v dnf &>/dev/null; then
                PKG_TYPE="dnf"
            else
                PKG_TYPE="yum"
            fi
            ;;
        arch|manjaro)
            PKG_TYPE="pacman"
            ;;
        opensuse*|sles)
            PKG_TYPE="zypper"
            ;;
        *)
            warn "未识别的发行版: $OS_ID，将尝试使用通用方式安装 Docker"
            PKG_TYPE="generic"
            ;;
    esac

    info "检测到系统: $OS_NAME"
    info "包管理器类型: $PKG_TYPE"
}

detect_arch() {
    local arch
    arch=$(uname -m)
    case "$arch" in
        x86_64|amd64)  echo "amd64" ;;
        aarch64|arm64) echo "arm64" ;;
        armv7l)        echo "armv7" ;;
        *)
            error "不支持的 CPU 架构: $arch"
            exit 1
            ;;
    esac
}

#-------------------------------------------------------------------------------
# 小工具
#-------------------------------------------------------------------------------
command_exists() {
    command -v "$1" &>/dev/null
}

confirm() {
    local prompt="$1"
    local default="${2:-y}"
    local yn
    read -p "$prompt (y/n, 默认 $default): " yn
    yn="${yn:-$default}"
    [[ "$yn" == "y" || "$yn" == "Y" ]]
}

# 获取服务器主 IP
get_server_ip() {
    ip -4 addr show scope global 2>/dev/null | grep -oP 'inet \K[\d.]+' | head -1 || echo "服务器IP"
}

#-------------------------------------------------------------------------------
# 步骤 1: 安装 Docker Engine
# 官方文档: https://docs.docker.com/engine/install/
#-------------------------------------------------------------------------------
install_docker() {
    step "步骤 1/5: 安装 Docker Engine"

    if command_exists docker; then
        info "Docker 已安装: $(docker --version)"
        return 0
    fi

    if ! confirm "Docker 未安装，是否安装？"; then
        warn "已跳过 Docker 安装 (后续步骤将失败)"
        return 0
    fi

    info "开始安装 Docker Engine..."

    case "$PKG_TYPE" in
        #--- Ubuntu / Debian ---
        # 参考: https://docs.docker.com/engine/install/ubuntu/
        apt)
            info "卸载旧版本 (如有)..."
            for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
                apt-get remove -y "$pkg" 2>/dev/null || true
            done

            info "安装依赖..."
            apt-get update -qq
            apt-get install -y -qq ca-certificates curl

            info "添加 Docker 官方 GPG 密钥..."
            install -m 0755 -d /etc/apt/keyrings
            curl -fsSL "https://download.docker.com/linux/${OS_ID}/gpg" -o /etc/apt/keyrings/docker.asc
            chmod a+r /etc/apt/keyrings/docker.asc

            info "添加 Docker APT 源..."
            echo "deb [arch=$(detect_arch) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/${OS_ID} $(lsb_release -cs 2>/dev/null || echo "bookworm") stable" \
                > /etc/apt/sources.list.d/docker.list

            apt-get update -qq
            apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
            ;;

        #--- CentOS / RHEL / Fedora (dnf) ---
        dnf)
            info "卸载旧版本 (如有)..."
            dnf remove -y docker docker-client docker-client-latest docker-common \
                docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true

            info "添加 Docker 官方仓库..."
            dnf config-manager --add-repo "https://download.docker.com/linux/${OS_ID}/docker-ce.repo" 2>/dev/null || \
                { dnf install -y dnf-plugins-core && dnf config-manager --add-repo "https://download.docker.com/linux/${OS_ID}/docker-ce.repo"; }

            info "安装 Docker Engine..."
            dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
            ;;

        #--- CentOS / RHEL (yum, 旧版) ---
        yum)
            info "卸载旧版本 (如有)..."
            yum remove -y docker docker-client docker-client-latest docker-common \
                docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true

            info "安装依赖..."
            yum install -y yum-utils

            info "添加 Docker 官方仓库..."
            yum-config-manager --add-repo "https://download.docker.com/linux/${OS_ID}/docker-ce.repo" 2>/dev/null || true

            info "安装 Docker Engine..."
            yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
            ;;

        #--- Arch Linux ---
        pacman)
            info "安装 Docker..."
            pacman -S --noconfirm docker docker-compose 2>/dev/null || true
            ;;

        #--- openSUSE ---
        zypper)
            info "安装 Docker..."
            zypper --non-interactive install docker docker-compose 2>/dev/null || true
            ;;

        #--- 通用 (使用 Docker 官方安装脚本) ---
        generic)
            warn "未识别的包管理器，使用 Docker 官方安装脚本..."
            curl -fsSL https://get.docker.com | bash
            ;;
    esac

    # 启动 Docker 服务并设为开机自启
    info "启动 Docker 服务..."
    systemctl enable docker --now 2>/dev/null || service docker start 2>/dev/null || true

    # 验证
    if command_exists docker; then
        info "Docker 安装完成: $(docker --version)"
    else
        error "Docker 安装失败，请手动安装后重试"
        error "参考: https://docs.docker.com/engine/install/"
        exit 1
    fi
}

#-------------------------------------------------------------------------------
# 步骤 2: 确保 Docker Compose 可用
#-------------------------------------------------------------------------------
install_docker_compose() {
    step "步骤 2/5: 检查 Docker Compose"

    # docker compose (Plugin 形式, v2) —— 优先使用
    if docker compose version &>/dev/null; then
        info "Docker Compose (Plugin v2) 已就绪: $(docker compose version)"
        return 0
    fi

    # docker-compose (独立二进制, v1) —— 兼容
    if command_exists docker-compose; then
        info "docker-compose (v1 独立版) 已安装: $(docker-compose --version)"
        warn "建议升级到 Docker Compose v2 Plugin"
        return 0
    fi

    if ! confirm "Docker Compose 未安装，是否安装？"; then
        warn "已跳过 Docker Compose 安装"
        return 0
    fi

    info "安装 Docker Compose Plugin..."

    case "$PKG_TYPE" in
        apt)
            apt-get update -qq && apt-get install -y -qq docker-compose-plugin 2>/dev/null || true
            ;;
        dnf|yum)
            dnf install -y docker-compose-plugin 2>/dev/null || yum install -y docker-compose-plugin 2>/dev/null || true
            ;;
        *)
            # 通用安装: 从 GitHub 下载二进制到 Docker CLI plugins 目录
            local arch
            arch=$(detect_arch)
            local url="https://github.com/docker/compose/releases/latest/download/docker-compose-linux-${arch}"
            info "从 GitHub 下载: $url"
            mkdir -p /usr/local/lib/docker/cli-plugins
            curl -fsSL "$url" -o /usr/local/lib/docker/cli-plugins/docker-compose
            chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
            ;;
    esac

    if docker compose version &>/dev/null; then
        info "Docker Compose (Plugin v2) 安装完成: $(docker compose version)"
    else
        # 最后兜底: 下载独立二进制
        warn "Plugin 安装失败，尝试独立二进制..."
        local arch
        arch=$(detect_arch)
        curl -fsSL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-${arch}" \
            -o /usr/local/bin/docker-compose
        chmod +x /usr/local/bin/docker-compose
        if command_exists docker-compose; then
            info "docker-compose (独立版) 安装完成: $(docker-compose --version)"
        else
            error "Docker Compose 安装失败"
            exit 1
        fi
    fi
}

#-------------------------------------------------------------------------------
# 步骤 3: 部署 Dockge (Docker Compose 可视化管理面板)
# 官方仓库: https://github.com/louislam/dockge
#
# 部署方式:
#   - 创建 /opt/dockge 目录, 下载官方 compose.yaml
#   - 默认端口 5001, WebUI 管理 Docker Compose 堆栈
#   - 堆栈文件统一放在 /opt/stacks 下
#-------------------------------------------------------------------------------
deploy_dockge() {
    step "步骤 3/5: 部署 Dockge (Compose 可视化管理)"

    # 检查是否已部署
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "dockge"; then
        info "Dockge 容器已在运行，跳过部署"
        return 0
    fi

    if ! confirm "是否部署 Dockge (Docker Compose Web 管理面板)？"; then
        warn "已跳过 Dockge 部署"
        return 0
    fi

    # Dockge 默认端口
    local dockge_port
    read -p "Dockge WebUI 端口 (默认: 5001): " dockge_port
    dockge_port="${dockge_port:-5001}"

    # 创建目录
    info "创建 Dockge 目录..."
    mkdir -p "$DOCKGE_DIR" "$DOCKGE_STACKS_DIR"

    # 下载官方 compose.yaml
    # 官方支持通过 URL 参数自定义端口和堆栈路径:
    #   ?port=5001&stacksPath=/opt/stacks
    local compose_url="https://dockge.kuma.pet/compose.yaml?port=${dockge_port}&stacksPath=${DOCKGE_STACKS_DIR}"
    info "下载 Dockge compose.yaml..."
    info "URL: $compose_url"

    if ! curl -fsSL "$compose_url" -o "${DOCKGE_DIR}/compose.yaml"; then
        # 如果官方 URL 不可用，手动写入 compose 文件
        warn "无法从官方 URL 下载，使用备用配置..."
        cat > "${DOCKGE_DIR}/compose.yaml" << YAML_EOF
#===============================================================================
# Dockge - Docker Compose 可视化管理面板
# 官方: https://github.com/louislam/dockge
#===============================================================================
version: "3.8"
services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      - ${dockge_port}:5001                              # WebUI 端口
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock        # 接管 Docker (必需)
      - ./data:/app/data                                 # Dockge 自身数据
      - ${DOCKGE_STACKS_DIR}:${DOCKGE_STACKS_DIR}         # 堆栈文件目录
    environment:
      - DOCKGE_STACKS_DIR=${DOCKGE_STACKS_DIR}            # 告知 Dockge 堆栈位置
YAML_EOF
    fi

    # 启动
    info "启动 Dockge..."
    cd "$DOCKGE_DIR"
    docker compose up -d
    info "Dockge 部署完成 ✓"
}

#-------------------------------------------------------------------------------
# 步骤 4: 部署 AstrBot + NapCat (使用官方 compose 文件)
#
# 官方 astrbot.yml 来源:
#   NapCat-Docker 仓库: https://github.com/NapNeko/NapCat-Docker
#   直接下载: wget https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml
#
# 这个官方 compose 文件已包含:
#   - AstrBot 服务 (soulter/astrbot)
#   - NapCat 服务 (mlikiowa/napcat-docker)
#   - 两个服务在同一 Docker 网络内, 容器名互访
#-------------------------------------------------------------------------------
deploy_astrbot() {
    step "步骤 4/5: 部署 AstrBot + NapCat (QQ 机器人)"

    # 检查是否已部署
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -qE "astrbot|napcat"; then
        info "AstrBot/NapCat 容器已在运行"
        if ! confirm "是否重新部署 (会覆盖现有 compose 文件)？"; then
            info "跳过部署"
            return 0
        fi
    fi

    if ! confirm "是否部署 AstrBot + NapCat？"; then
        warn "已跳过 AstrBot + NapCat 部署"
        return 0
    fi

    # 询问部署目录
    local deploy_dir
    read -p "部署目录 (默认: ${ASTROBOT_DIR}): " deploy_dir
    deploy_dir="${deploy_dir:-$ASTROBOT_DIR}"
    mkdir -p "$deploy_dir"
    info "部署目录: $deploy_dir"

    # 下载官方 astrbot.yml
    info "下载官方 astrbot.yml..."
    info "来源: $ASTROBOT_COMPOSE_URL"

    if wget -q --show-progress "$ASTROBOT_COMPOSE_URL" -O "${deploy_dir}/astrbot.yml"; then
        info "下载完成 → ${deploy_dir}/astrbot.yml"
    else
        info "wget 失败，尝试 curl..."
        if curl -fsSL "$ASTROBOT_COMPOSE_URL" -o "${deploy_dir}/astrbot.yml"; then
            info "下载完成 → ${deploy_dir}/astrbot.yml"
        else
            error "无法下载官方 astrbot.yml"
            error "请检查网络后手动执行:"
            error "  mkdir -p ${deploy_dir}"
            error "  wget ${ASTROBOT_COMPOSE_URL} -O ${deploy_dir}/astrbot.yml"
            error "  cd ${deploy_dir} && sudo docker compose -f astrbot.yml up -d"
            return 0
        fi
    fi

    # 询问是否使用国内镜像加速
    if confirm "是否使用国内镜像加速 (将替换镜像为 DaoCloud 代理)？"; then
        info "替换镜像为国内代理..."
        # 替换 astrbot 镜像
        sed -i 's|image: soulter/astrbot:latest|image: m.daocloud.io/docker.io/soulter/astrbot:latest|g' \
            "${deploy_dir}/astrbot.yml" 2>/dev/null || true
        # 替换 napcat 镜像
        sed -i 's|image: mlikiowa/napcat-docker:latest|image: m.daocloud.io/docker.io/mlikiowa/napcat-docker:latest|g' \
            "${deploy_dir}/astrbot.yml" 2>/dev/null || true
    fi

    # 拉取镜像并启动
    info "启动 AstrBot + NapCat..."
    cd "$deploy_dir"

    info "拉取镜像 (可能需要几分钟，取决于网络)..."
    docker compose -f astrbot.yml pull || {
        warn "镜像拉取失败，可能是网络问题"
        warn "国内服务器可尝试配置镜像加速: https://docs.docker.com/engine/daemon/prometheus/"
        warn "手动重试: cd ${deploy_dir} && sudo docker compose -f astrbot.yml up -d"
        return 0
    }

    docker compose -f astrbot.yml up -d
    info "AstrBot + NapCat 部署完成 ✓"
}

#-------------------------------------------------------------------------------
# 步骤 5: 状态检查
#-------------------------------------------------------------------------------
check_status() {
    step "步骤 5/5: 检查所有容器状态"

    echo ""

    # Dockge
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "dockge"; then
        info "Dockge    ✓ 运行中"
    else
        warn "Dockge    ✗ 未运行"
    fi

    # AstrBot
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "astrbot"; then
        info "AstrBot   ✓ 运行中"
    else
        warn "AstrBot   ✗ 未运行"
    fi

    # NapCat
    if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "napcat"; then
        info "NapCat    ✓ 运行中"
    else
        warn "NapCat    ✗ 未运行"
    fi

    echo ""
    info "完整容器列表:"
    docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || true
    echo ""
}

#-------------------------------------------------------------------------------
# 部署后指引
#-------------------------------------------------------------------------------
show_guide() {
    local server_ip
    server_ip=$(get_server_ip)

    echo ""
    echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
    echo -e "${BLUE}║${NC}                                                              ${BLUE}║${NC}"
    echo -e "${BLUE}║${NC}       ${GREEN}🎉 部署完成！请按以下步骤完成初始化配置${NC}                    ${BLUE}║${NC}"
    echo -e "${BLUE}║${NC}                                                              ${BLUE}║${NC}"
    echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"

    #-----------------------------------------------------------------
    # Dockge 指引
    #-----------------------------------------------------------------
    echo ""
    echo -e "${CYAN}┌── Dockge - Docker Compose 可视化管理 ──────────────────────────┐${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  ${YELLOW}访问地址:${NC} ${GREEN}http://${server_ip}:5001${NC}                              ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  ${YELLOW}堆栈目录:${NC} ${GREEN}${DOCKGE_STACKS_DIR}${NC}                                  ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  首次使用:                                                   ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  1. 浏览器打开上述地址                                       ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  2. 创建管理员账号和密码                                     ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  3. 右上角 "扫描堆栈文件夹" → 自动发现 AstrBot 堆栈          ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"
    echo -e "${CYAN}└──────────────────────────────────────────────────────────────┘${NC}"

    #-----------------------------------------------------------------
    # AstrBot + NapCat 指引
    #-----------------------------------------------------------------
    echo ""
    echo -e "${CYAN}┌── AstrBot + NapCat - QQ 机器人配置 ────────────────────────────┐${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}① 获取 NapCat WebUI Token${NC}                                    ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  ${GREEN}docker logs napcat 2>&1 | grep -i 'token\|WebUiToken'${NC}     ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}② 扫码登录机器人 QQ${NC}                                         ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  地址: ${GREEN}http://${server_ip}:6099/webui/${NC}                            ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  输入 Token → 手机 QQ 扫码 → 完成登录                        ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}③ NapCat 配置反向 WebSocket (连接 AstrBot)${NC}                  ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  NapCat WebUI → 网络配置 → 新建 → WebSocket 客户端:         ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    名称:     ${GREEN}AstrBot${NC}                                        ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    URL:      ${GREEN}ws://astrbot:6199/ws${NC}  (容器名互访, 同 compose 网络) ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    消息格式: ${GREEN}Array${NC}                                          ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    心跳间隔: ${GREEN}5000${NC}                                           ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    重连间隔: ${GREEN}5000${NC}                                           ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}④ 获取 AstrBot WebUI 密码${NC}                                    ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  ${GREEN}docker logs astrbot 2>&1 | grep -i password${NC}                ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}⑤ 登录 AstrBot WebUI 配置适配器${NC}                              ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  地址: ${GREEN}http://${server_ip}:6185${NC}                                    ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  用户名: ${GREEN}astrbot${NC}                                             ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  密码: 步骤④获取的随机密码                                    ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  → 机器人 → 创建 → OneBot v11 (QQ个人号)                     ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}    反向 WS 主机: ${GREEN}0.0.0.0${NC}    反向 WS 端口: ${GREEN}6199${NC}            ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}⑥ 接入 AI 模型${NC}                                               ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  AstrBot WebUI → 模型提供商 → 新增                           ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  选择 DeepSeek / OpenAI / SiliconFlow 等，填入 API Key        ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"

    echo -e "${CYAN}│${NC}  ${YELLOW}⑦ 设置管理员${NC}                                                 ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  AstrBot WebUI → 配置 → 其他配置 → 管理员 ID                 ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}  填写你自己的 QQ 号 (非机器人 QQ 号)                          ${CYAN}│${NC}"
    echo -e "${CYAN}│${NC}                                                              ${CYAN}│${NC}"
    echo -e "${CYAN}└──────────────────────────────────────────────────────────────┘${NC}"

    #-----------------------------------------------------------------
    # 端口 & 注意事项
    #-----------------------------------------------------------------
    echo ""
    echo -e "${YELLOW}⚠️  防火墙/安全组需放行的端口:${NC}"
    echo -e "  ${GREEN}5001${NC}  Dockge 管理面板"
    echo -e "  ${GREEN}6185${NC}  AstrBot WebUI"
    echo -e "  ${GREEN}6099${NC}  NapCat WebUI"
    echo -e "  ${GREEN}6199${NC}  OneBot 反向 WebSocket (AstrBot ← NapCat)"
    echo -e "  ${GREEN}3000${NC}  NapCat WebSocket 端口"
    echo -e "  ${GREEN}3001${NC}  NapCat HTTP API 端口"
    echo ""

    echo -e "${YELLOW}💡 提示:${NC}"
    echo "  • 不要在常用大号上跑机器人，建议用小号"
    echo "  • 新号/异地登录易触发腾讯风控，建议用有等级的老号"
    echo "  • NapCat 每次重启可能需要重新扫码，登录缓存已持久化到数据卷"
    echo "  • 所有服务都可通过 Dockge (端口 5001) 统一管理启停/日志/编辑"
    echo ""

    echo -e "${YELLOW}📋 常用命令:${NC}"
    echo -e "  ${GREEN}docker compose -f ${ASTROBOT_DIR}/astrbot.yml ps${NC}         # 查看 AstrBot+NapCat 状态"
    echo -e "  ${GREEN}docker compose -f ${ASTROBOT_DIR}/astrbot.yml logs -f${NC}    # 实时日志"
    echo -e "  ${GREEN}docker compose -f ${ASTROBOT_DIR}/astrbot.yml restart${NC}    # 重启"
    echo -e "  ${GREEN}docker compose -f ${DOCKGE_DIR}/compose.yaml ps${NC}           # 查看 Dockge 状态"
    echo -e "  ${GREEN}docker logs astrbot${NC}                                        # AstrBot 日志"
    echo -e "  ${GREEN}docker logs napcat${NC}                                         # NapCat 日志"
    echo ""
}

#-------------------------------------------------------------------------------
# 主流程
#-------------------------------------------------------------------------------
main() {
    # 检查 root 权限
    if [[ $EUID -ne 0 ]]; then
        error "请使用 sudo 运行此脚本: sudo ./deploy-astrbot-napcat.sh"
        exit 1
    fi

    echo ""
    echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
    echo -e "${BLUE}║${NC}                                                              ${BLUE}║${NC}"
    echo -e "${BLUE}║${NC}   ${GREEN}AstrBot + NapCat QQ 机器人 一键部署脚本${NC}                     ${BLUE}║${NC}"
    echo -e "${BLUE}║${NC}   Docker → Dockge → AstrBot → NapCat                       ${BLUE}║${NC}"
    echo -e "${BLUE}║${NC}                                                              ${BLUE}║${NC}"
    echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"
    echo ""

    # -- 系统检测 --
    detect_os
    echo ""

    # -- 确认执行计划 --
    warn "本脚本将依次执行:"
    echo "  1. 安装 Docker Engine  (如未安装)"
    echo "  2. 安装 Docker Compose (如未安装)"
    echo "  3. 部署 Dockge         (Compose 可视化管理面板, :5001)"
    echo "  4. 部署 AstrBot+NapCat (QQ 机器人, 使用官方 astrbot.yml)"
    echo "  5. 检查运行状态 + 输出配置指引"
    echo ""

    if ! confirm "是否开始部署？"; then
        info "已取消"
        exit 0
    fi

    # -- 执行 --
    install_docker
    install_docker_compose
    deploy_dockge
    deploy_astrbot
    check_status
    show_guide
}

#-------------------------------------------------------------------------------
# 入口
#-------------------------------------------------------------------------------
main
