#!/usr/bin/env bash
# =============================================================================
# QQID 一体化容器一键安装脚本（NapCat + NCQQ-Haizakura）
#
# 用法：
#   sudo bash install.sh
#
# 分发服务器（本脚本与 qqid-bot.tar 存放处）上的用户可一条命令安装：
#   curl -fsSL http://<分发服务器>/<路径>/install.sh | sudo IMAGE_URL=http://<分发服务器>/<路径>/qqid-bot.tar bash
#
# 可用环境变量：
#   IMAGE_TAR        镜像 tar 包路径（默认取本脚本同目录下的 qqid-bot.tar）
#   IMAGE_URL        镜像 tar 包下载地址（存在时优先从该地址下载）
#   DATA_DIR         持久化数据目录（默认 /opt/qqid）
#   CONTAINER_NAME   容器名（默认 qqid-bot）
#   ADMIN_QQ         管理员 QQ 号，多个用英文逗号分隔（可选，登录后也可再设置）
#   WEBUI_PORT       宿主映射 NapCat WebUI 端口（默认 6099）
#   KOISHI_PORT      宿主映射机器人 WebUI 端口（默认 6091）
# =============================================================================
set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
IMAGE_TAR="${IMAGE_TAR:-$SCRIPT_DIR/qqid-bot.tar}"
DATA_DIR="${DATA_DIR:-/opt/qqid}"
CONTAINER_NAME="${CONTAINER_NAME:-qqid-bot}"
ADMIN_QQ="${ADMIN_QQ:-}"
WEBUI_PORT="${WEBUI_PORT:-6099}"
KOISHI_PORT="${KOISHI_PORT:-6091}"
IMAGE_NAME="qqid-bot:latest"

log() { echo -e "\033[1;32m[qqid]\033[0m $*"; }
warn() { echo -e "\033[1;33m[qqid]\033[0m $*"; }
err() { echo -e "\033[1;31m[qqid]\033[0m $*" >&2; }

must_root() {
  if [ "$(id -u)" != "0" ]; then
    err "请使用 root 或 sudo 运行本脚本"
    exit 1
  fi
}

have_cmd() { command -v "$1" >/dev/null 2>&1; }

# -----------------------------------------------------------------------------
# 安装 Docker（未安装时自动安装；网络受限时使用国内镜像源）
# -----------------------------------------------------------------------------
install_docker() {
  if have_cmd docker && docker info >/dev/null 2>&1; then
    log "已检测到 Docker，跳过安装"
    return 0
  fi

  log "未检测到 Docker，开始安装…"

  # 方式 1：官方一键脚本（可能因网络失败）
  if ! have_cmd docker; then
    if curl -fsSL https://get.docker.com | sh; then
      :
    else
      warn "官方脚本安装失败，回退到发行版包管理器 + 国内镜像源"
      install_docker_distro
    fi
  fi

  # 配置国内镜像加速（若尚无 daemon.json）
  if [ -d /etc/docker ]; then
    if [ ! -f /etc/docker/daemon.json ]; then
      log "写入 Docker 国内镜像加速配置…"
      mkdir -p /etc/docker
      cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.1panel.dev",
    "https://docker.1ms.run",
    "https://dockerproxy.com"
  ]
}
EOF
    fi
  fi

  # 启动 docker
  start_docker
  if ! docker info >/dev/null 2>&1; then
    err "Docker 安装或启动失败，请手动检查"
    exit 1
  fi
  log "Docker 安装完成"
}

install_docker_distro() {
  if have_cmd apt-get; then
    # Debian / Ubuntu
    if [ -f /etc/apt/sources.list ]; then
      cp /etc/apt/sources.list /etc/apt/sources.list.qqid.bak 2>/dev/null || true
    fi
    # 使用阿里云 Ubuntu/Debian 镜像源（尽力而为，失败则沿用原源）
    if grep -q ubuntu /etc/os-release; then
      cat > /etc/apt/sources.list <<'EOF'
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
EOF
    fi
    apt-get update || true
    apt-get install -y docker.io || {
      # 回退到官方脚本
      curl -fsSL https://get.docker.com | sh
    }
  elif have_cmd dnf; then
    dnf install -y docker || curl -fsSL https://get.docker.com | sh
  elif have_cmd yum; then
    yum install -y docker || curl -fsSL https://get.docker.com | sh
  elif have_cmd apk; then
    apk add docker || curl -fsSL https://get.docker.com | sh
  else
    err "无法识别发行版包管理器，请手动安装 Docker 后重试"
    exit 1
  fi
}

start_docker() {
  if have_cmd systemctl; then
    systemctl enable docker >/dev/null 2>&1 || true
    systemctl start docker >/dev/null 2>&1 || true
  elif have_cmd service; then
    service docker start >/dev/null 2>&1 || true
  else
    dockerd >/dev/null 2>&1 &
    sleep 3
  fi
  # 等待 docker 就绪
  n=0
  until docker info >/dev/null 2>&1; do
    n=$((n+1)); [ "$n" -ge 20 ] && break; sleep 1
  done
}

# -----------------------------------------------------------------------------
# 获取镜像（本地 tar 或从分发服务器下载）
# -----------------------------------------------------------------------------
acquire_image() {
  if [ -n "${IMAGE_URL:-}" ]; then
    mkdir -p "$DATA_DIR"
    local dest="$DATA_DIR/qqid-bot.tar"
    log "下载镜像: $IMAGE_URL"
    if have_cmd curl; then
      curl -fL --retry 3 --connect-timeout 20 -o "$dest" "$IMAGE_URL" \
        || { err "curl 下载镜像失败"; exit 1; }
    elif have_cmd wget; then
      wget -O "$dest" "$IMAGE_URL" || { err "wget 下载镜像失败"; exit 1; }
    else
      err "缺少 curl/wget，无法下载镜像；请改用 IMAGE_TAR 指定本地 tar 路径"
      exit 1
    fi
    IMAGE_TAR="$dest"
  fi
}

# -----------------------------------------------------------------------------
# 载入镜像
# -----------------------------------------------------------------------------
load_image() {
  if [ ! -f "$IMAGE_TAR" ]; then
    err "找不到镜像文件: $IMAGE_TAR"
    err "请把 qqid-bot.tar 放到本脚本同目录，或用 IMAGE_TAR/IMAGE_URL 指定来源"
    exit 1
  fi
  log "载入镜像: $IMAGE_TAR"
  docker load -i "$IMAGE_TAR"
}

# -----------------------------------------------------------------------------
# 运行容器
# -----------------------------------------------------------------------------
run_container() {
  mkdir -p "$DATA_DIR/napcat-config" "$DATA_DIR/qq" "$DATA_DIR/bot"

  # 若旧容器存在则先移除
  if docker ps -a --format '{{.Names}}' | grep -qx "$CONTAINER_NAME"; then
    log "移除旧容器: $CONTAINER_NAME"
    docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
  fi

  local extra=()
  if [ -n "$ADMIN_QQ" ]; then
    extra+=(-e "ADMIN_QQ=$ADMIN_QQ")
  fi

  log "启动容器: $CONTAINER_NAME"
  docker run -d \
    --name "$CONTAINER_NAME" \
    --restart unless-stopped \
    -p "${WEBUI_PORT}:6099" \
    -p "${KOISHI_PORT}:6091" \
    -e "TZ=Asia/Shanghai" \
    "${extra[@]}" \
    -v "$DATA_DIR/napcat-config:/app/napcat/config" \
    -v "$DATA_DIR/qq:/app/.config/QQ" \
    -v "$DATA_DIR/bot:/data" \
    "$IMAGE_NAME"

  log "容器已启动，等待初始化…"
  sleep 8
}

# -----------------------------------------------------------------------------
main() {
  must_root
  install_docker
  acquire_image
  load_image
  run_container

  echo
  echo "=============================================================="
  log "安装完成！"
  log "NapCat WebUI（扫码登录 QQ）: http://<服务器IP>:${WEBUI_PORT}/webui"
  log "机器人 WebUI（管理配置）   : http://<服务器IP>:${KOISHI_PORT}"
  echo
  log "获取 WebUI Token / 日志："
  log "   docker logs ${CONTAINER_NAME}"
  if [ -n "$ADMIN_QQ" ]; then
    log "已预设管理员: $ADMIN_QQ"
  else
    log "设置管理员（登录后执行）："
    log "   docker exec ${CONTAINER_NAME} /app/setadmin.sh <你的QQ号>"
  fi
  echo "=============================================================="
}

main "$@"
