#!/bin/bash
# ============================================================
# 节点一键升级脚本（预检 + 升级）
# 功能：检测环境 → 下载 latest 包 → 解压 → post_command.sh → 重启服务
#
# 用法：
#   ./upgrade.sh                 # 常规升级
#   ./upgrade.sh -c              # 仅预检环境（不执行任何操作）
#   ./upgrade.sh -d              # 演练模式（打印将执行的命令，不执行）
#   ./upgrade.sh -a aarch64      # 手动指定架构
#   ./upgrade.sh -p /opt/openfog # 手动指定安装路径
#   ./upgrade.sh -u <url>        # 手动指定下载 URL
#   ./upgrade.sh -h              # 帮助
#   ./upgrade.sh -v              # 版本
# ============================================================

SCRIPT_VERSION="1.0.0"
ARCH=""
INSTALL_PATH_OVERRIDE=""
URL_OVERRIDE=""
MODE="upgrade"          # upgrade / check / dry-run
FORCE=""

show_help() {
    cat <<EOF
用法: $0 [选项]

节点一键升级脚本 v${SCRIPT_VERSION}

模式:
  (默认)               执行升级（下载→解压→post_command→重启服务）
  -c, --check          仅预检环境，不执行任何操作
  -d, --dry-run        演练模式：打印将执行的命令，不实际执行

选项:
  -h, --help           显示帮助
  -v, --version        显示版本
  -a, --arch <arch>    手动指定架构 (x86_64 / aarch64 / armv7)
  -p, --path <path>    手动指定安装路径 (默认读 /etc/pear/pear_installation_path)
  -u, --url <url>      手动指定下载 URL (默认使用 latest 包)
  -f, --force          强制模式（透传给 post_command.sh）

示例:
  $0                    常规升级
  $0 -c                 预检环境
  $0 -d                 演练
  $0 -c -a aarch64      按指定架构预检
EOF
}

# ========== 解析参数 ==========
while [ $# -gt 0 ]; do
    case "$1" in
        -h|--help) show_help; exit 0 ;;
        -v|--version) echo "upgrade.sh v${SCRIPT_VERSION}"; exit 0 ;;
        -c|--check) MODE="check"; shift ;;
        -d|--dry-run) MODE="dry-run"; shift ;;
        -a|--arch) ARCH="$2"; shift 2 ;;
        -p|--path) INSTALL_PATH_OVERRIDE="$2"; shift 2 ;;
        -u|--url) URL_OVERRIDE="$2"; shift 2 ;;
        -f|--force) FORCE="-f"; shift ;;
        *) echo "ERROR: 未知参数: $1"; show_help; exit 1 ;;
    esac
done

# ========== ① 架构判断 ==========
if [ -z "${ARCH}" ]; then
    case "$(uname -m)" in
        x86_64)  ARCH="x86_64" ;;
        aarch64) ARCH="aarch64" ;;
        armv7*)  ARCH="armv7" ;;
        *) echo "ERROR: Unknown arch: $(uname -m)"; exit 1 ;;
    esac
fi
case "${ARCH}" in
    x86_64)  PKG="fogvdn_PEAR_X64_LINUX_latest.tar.gz" ;;
    aarch64) PKG="fogvdn_PEAR_ARM64_LINUX_latest.tar.gz" ;;
    armv7)   PKG="fogvdn_PEAR_ARM_LINUX_latest.tar.gz" ;;
    *) echo "ERROR: Unsupported arch: ${ARCH}"; exit 1 ;;
esac

# ========== ② 安装路径 ==========
if [ -n "${INSTALL_PATH_OVERRIDE}" ]; then
    INSTALL_PATH="${INSTALL_PATH_OVERRIDE}"
else
    INSTALL_PATH=""
    if [ -f /etc/pear/pear_installation_path ]; then
        INSTALLATION_PATH=$(grep '^INSTALLATION_PATH=' /etc/pear/pear_installation_path \
                            | head -1 | cut -d= -f2-)
        INSTALL_PATH="${INSTALLATION_PATH}"
    fi
fi
[ "${INSTALL_PATH}" = "/" ] && INSTALL_PATH=""

# ========== ③ post_command.sh 路径 ==========
if [ -n "${INSTALL_PATH}" ]; then
    POST="${INSTALL_PATH}/etc/pear/pear_update/post_command.sh"
else
    POST="/etc/pear/pear_update/post_command.sh"
fi

# ========== ④ URL ==========
URL="${URL_OVERRIDE:-https://download.openfogos.com/release/${PKG}}"

# ========== ⑤ 重启方式 ==========
restart_cmd() {
    if command -v systemctl >/dev/null 2>&1; then
        echo "systemctl restart openfog.service"
    else
        echo "service fogvdn restart"
    fi
}

# ========== 输出环境信息 ==========
echo "=============================================="
echo " 节点升级脚本 v${SCRIPT_VERSION}"
echo "=============================================="
echo "【环境信息】"
echo "  系统:       $(uname -s) $(uname -r) ($([ -f /etc/openwrt_release ] && echo OpenWRT/iStoreOS || echo 非OpenWRT))"
echo "  架构:       ${ARCH}"
echo "  升级包:     ${PKG}"
echo "  安装路径:   ${INSTALL_PATH:-/}"
echo "  post_cmd:   ${POST}"
echo "  下载URL:    ${URL}"
echo "  重启命令:   $(restart_cmd)"
echo ""

# ========== 预检模式：到此为止 ==========
if [ "${MODE}" = "check" ]; then
    echo "=============================================="
    echo " 预检完成（仅检测，未执行任何操作）"
    echo "=============================================="
    exit 0
fi

# ========== 执行前检查 ==========
if [ ! -f "${POST}" ]; then
    echo "ERROR: ${POST} 不存在，无法升级"
    exit 1
fi
if ! command -v curl >/dev/null 2>&1; then
    echo "ERROR: curl 不存在"
    exit 1
fi

# ========== 演练模式 ==========
if [ "${MODE}" = "dry-run" ]; then
    echo "[dry-run] curl -f -o /tmp/${PKG} ${URL}"
    echo "[dry-run] tar -zxf /tmp/${PKG} -C ${INSTALL_PATH:-/}"
    echo "[dry-run] ${POST} ${FORCE}"
    echo "[dry-run] $(restart_cmd)"
    echo "[dry-run] 结束（演练模式，未执行任何操作）"
    exit 0
fi

# ========== 执行升级 ==========
echo "==> 下载 ${URL}"
curl -f -o "/tmp/${PKG}" "${URL}" || { echo "下载失败"; exit 1; }

echo "==> 解压到 ${INSTALL_PATH:-/}"
tar -zxf "/tmp/${PKG}" -C "${INSTALL_PATH:-/}" || { echo "解压失败"; exit 1; }
rm -f "/tmp/${PKG}"

echo "==> 执行 ${POST}"
"${POST}" ${FORCE}

echo "==> 重启服务"
$(restart_cmd)

echo "==> 升级完成，rtty 即将断开，请稍后重新连接"
