#!/bin/bash
# upgrade_init：升级**之前**执行。
#
# 调用后端生成一致性快照（VACUUM INTO 快照 + 主密钥，tar.gz）。
# 备份失败即中止升级——宁可这次不升，也不要带着不确定能否恢复的数据进新版本。
set -uo pipefail

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

tp_dump_env upgrade_init
tp_log upgrade_init "升级前备份开始"

data="$(tp_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" || tp_fail "无法创建备份目录 $backup_dir"

bin="$(tp_app_dest)/server/totpilot-server"
if [ ! -x "$bin" ]; then
    tp_fail "找不到后端二进制 ${bin}，无法生成升级前备份，已中止升级"
fi

if ! tp_run_as_app_user "$bin" backup --data "$data" --out "$backup_file.partial" >/dev/null 2>&1; then
    rm -f "$backup_file.partial" 2>/dev/null
    tp_fail "升级前备份失败，已中止升级以保护数据"
fi

mv "$backup_file.partial" "$backup_file" || tp_fail "备份文件落盘失败"
tp_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

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