#!/usr/bin/env bash
# =============================================================================
# taiji-os 一键引导安装脚本
#
# 从 https://download.lizhisec.com/taiji-os/ 下载全部部署产物到本地，
# 然后调用 deploy.sh 完成整个环境部署（装工具→加载镜像→部署应用→启动容器+开机自启）。
#
# 用法（在目标 Linux 服务器上以 root 执行）：
#   curl -fsSL https://download.lizhisec.com/taiji-os/install.sh | sudo bash
#   # 或先下载再执行：
#   curl -fsSL -o install.sh https://download.lizhisec.com/taiji-os/install.sh
#   sudo bash install.sh
#
# 可用环境变量覆盖默认值：
#   BASE_URL      下载基址（默认 https://download.lizhisec.com/taiji-os）
#   WORK_DIR      本地工作目录（默认 /data/doker-tar）
#   DEPLOY_ARGS   传给 deploy.sh 的参数（默认 all；可设为 packages/sys/app 等分步）
#   SKIP_DOWNLOAD=1 跳过下载，仅用 WORK_DIR 已有文件执行 deploy.sh
# =============================================================================
set -euo pipefail

# ----------------------------- 配置 -------------------------------------------
BASE_URL="${BASE_URL:-https://download.lizhisec.com/taiji-os}"
WORK_DIR="${WORK_DIR:-/data/doker-tar}"
DEPLOY_ARGS="${DEPLOY_ARGS:-all}"
SKIP_DOWNLOAD="${SKIP_DOWNLOAD:-0}"

# 需要从服务器拉取的文件清单（与 deploy.sh 期望的产物一一对应）
# 格式："文件名"
FILES=(
  "deploy.sh"
  "install.sh"
  "sys.zip"
  "xglms-master.zip"
  "milvus-etcd.tar"
  "milvus-minio.tar"
  "milvus-standalone-v2.6.9.tar"
  "onlyoffice.tar"
  "xglms-pg-v14.tar"
)

# ----------------------------- 日志工具 ---------------------------------------
C_RED='\033[0;31m'; C_GREEN='\033[0;32m'; C_YELLOW='\033[1;33m'; C_BLUE='\033[0;34m'; C_NC='\033[0m'
log()  { echo -e "${C_BLUE}[$(date '+%H:%M:%S')]${C_NC} $*"; }
ok()   { echo -e "${C_GREEN}[$(date '+%H:%M:%S')] ✓${C_NC} $*"; }
warn() { echo -e "${C_YELLOW}[$(date '+%H:%M:%S')] !${C_NC} $*"; }
err()  { echo -e "${C_RED}[$(date '+%H:%M:%S')] ✗${C_NC} $*" >&2; }

# ----------------------------- 前置检查 ---------------------------------------
preflight() {
  # 必须 root（deploy.sh 要装包、改系统配置、起 systemd 服务）
  if [ "$(id -u)" -ne 0 ]; then
    err "请用 root 执行本脚本：sudo bash install.sh"
    exit 1
  fi
  # 需要下载工具 curl 或 wget
  if command -v curl >/dev/null 2>&1; then
    DL_CMD="curl"
  elif command -v wget >/dev/null 2>&1; then
    DL_CMD="wget"
  else
    err "未找到 curl 或 wget，请先安装其一：yum install -y curl 或 apt-get install -y curl"
    exit 1
  fi
}

# 下载单个文件，支持断点续传；已存在且大小>0 时默认跳过（除非 FORCE_DOWNLOAD=1）
download_file() {
  local fname="$1"
  local url="${BASE_URL}/${fname}"
  local dest="${WORK_DIR}/${fname}"
  if [ "${FORCE_DOWNLOAD:-0}" = "1" ] && [ -f "$dest" ]; then
    rm -f "$dest"
  fi
  if [ -s "$dest" ]; then
    ok "已存在，跳过下载：$fname ($(numfmt --to=iec "$dest" 2>/dev/null || stat -c%s "$dest" 2>/dev/null || echo '?') bytes)"
    return 0
  fi
  log "下载 $fname ..."
  case "$DL_CMD" in
    curl) curl -fL --retry 3 --retry-delay 5 -o "$dest" "$url" ;;
    wget) wget -c -t 3 -O "$dest" "$url" ;;
  esac
  if [ -s "$dest" ]; then
    ok "下载完成：$fname ($(numfmt --to=iec "$dest" 2>/dev/null || stat -c%s "$dest" 2>/dev/null || echo '?') bytes)"
  else
    err "下载失败：$url"
    return 1
  fi
}

# 校验文件完整性：tar/zip 用对应工具试列内容，deploy.sh/install.sh 检查非空
verify_file() {
  local fname="$1"
  local dest="${WORK_DIR}/${fname}"
  [ -s "$dest" ] || { err "$fname 为空"; return 1; }
  case "$fname" in
    *.tar)  tar -tf "$dest" >/dev/null 2>&1 || { err "$fname 不是有效 tar 包"; return 1; } ;;
    *.zip)  unzip -l "$dest" >/dev/null 2>&1 || { err "$fname 不是有效 zip 包"; return 1; } ;;
    *.sh)   head -c 2 "$dest" | grep -q '#!' >/dev/null 2>&1 || { err "$fname 不是有效脚本"; return 1; } ;;
  esac
  return 0
}

# ----------------------------- 主流程 -----------------------------------------
main() {
  preflight
  log "taiji-os 一键安装"
  log "  下载基址 : $BASE_URL"
  log "  工作目录 : $WORK_DIR"
  log "  部署参数 : $DEPLOY_ARGS"
  echo

  mkdir -p "$WORK_DIR"
  cd "$WORK_DIR"

  if [ "$SKIP_DOWNLOAD" = "1" ]; then
    warn "SKIP_DOWNLOAD=1，跳过下载，直接使用 $WORK_DIR 已有文件"
  else
    log "开始下载部署产物（共 ${#FILES[@]} 个文件，大文件较多请耐心等待）..."
    local failed=()
    for f in "${FILES[@]}"; do
      if ! download_file "$f"; then
        failed+=("$f")
      fi
    done
    if [ "${#failed[@]}" -gt 0 ]; then
      err "以下文件下载失败：${failed[*]}"
      err "请检查网络或 BASE_URL 后重试（已下载的文件会跳过）"
      exit 1
    fi

    log "校验文件完整性 ..."
    for f in "${FILES[@]}"; do
      verify_file "$f" || exit 1
    done
    ok "全部文件校验通过"
  fi

  # 确保部署脚本可执行
  chmod +x "${WORK_DIR}/deploy.sh" 2>/dev/null || true

  # 确保目标机有 unzip/docker（deploy.sh 会自行处理 unzip；docker 需预装或由 deploy.sh 提示）
  log "启动部署脚本 deploy.sh $DEPLOY_ARGS ..."
  echo "================================================================"
  # 用环境变量把工作目录传给 deploy.sh（deploy.sh 顶部 TAR_DIR 读取该变量）
  TAR_DIR="$WORK_DIR" bash "${WORK_DIR}/deploy.sh" $DEPLOY_ARGS
  local rc=$?
  echo "================================================================"
  if [ "$rc" -eq 0 ]; then
    ok "安装流程结束。运行 sudo bash ${WORK_DIR}/deploy.sh status 查看详细状态"
  else
    err "deploy.sh 执行返回非零状态($rc)，请查看上方日志排查"
    exit "$rc"
  fi
}

main "$@"
