#!/bin/bash
# upgrade_init：升级**之前**执行。
#
# 把当前数据目录打包备份。备份失败即中止升级——宁可这次不升，
# 也不要带着一份不确定能否恢复的数据进新版本。
#
# 注意：飞牛升级时会先停应用，因此这里不需要再停一次。
set -uo pipefail

SM_HOOK=upgrade_init
SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=lib.sh
. "$SELF_DIR/lib.sh"

sm_dump_env upgrade_init
sm_log upgrade_init "升级前备份开始"

data="$(sm_data_dir)"
old_ver="${TRIM_OLD_APPVER:-unknown}"
stamp="$(date '+%Y%m%d-%H%M%S')"
backup_dir="$data/backup"
backup_file="$backup_dir/pre-upgrade-${old_ver}-${stamp}.tar.gz"

mkdir -p "$backup_dir" || sm_fail "无法创建备份目录 $backup_dir"

# 只备份数据本身，排除 backup/ 与 logs/ 避免自包含。
# 备份文件先写 .partial，成功后再改名——防止中断留下半个可用文件。
tar czf "$backup_file.partial" \
    --exclude='./backup' \
    --exclude='./logs' \
    -C "$data" . >/dev/null 2>&1
tar_rc=$?

if [ "$tar_rc" -ne 0 ]; then
    rm -f "$backup_file.partial" 2>/dev/null
    sm_fail "升级前备份失败（tar 退出码 ${tar_rc}），已中止升级以保护数据"
fi

mv "$backup_file.partial" "$backup_file" || sm_fail "备份文件落盘失败"
sm_chown_to_app_user "$backup_file"

# 只保留最近 5 份升级前备份，避免长期占用存储。
ls -1t "$backup_dir"/pre-upgrade-*.tar.gz 2>/dev/null \
    | tail -n +6 \
    | while read -r old; do rm -f "$old" 2>/dev/null || true; done

sm_log upgrade_init "升级前备份完成：$backup_file"
exit 0
