#!/usr/bin/env bash
# vps-manager 自动更新脚本（由 systemd timer 定时触发）
# 1. 自动同步 deploy/ 下的 systemd 单元文件（有变更才拷贝 + daemon-reload）
# 2. 从 Gitea 拉取最新代码，如有更新则装依赖并重启服务
#
# 可配置项（环境变量）：
#   VPS_MANAGER_DIR   项目根目录（默认 /opt/vps-manager）
#   VPS_MANAGER_SVC   systemd 服务名（默认 vps-manager）
#   GIT_BRANCH        跟踪的远端分支（默认 main）
#
# 使用示例：
#   VPS_MANAGER_DIR=/srv/vps ./update.sh
#   或在 systemd unit 中设置 Environment=VPS_MANAGER_DIR=/srv/vps

set -euo pipefail

APP_DIR="${VPS_MANAGER_DIR:-/opt/vps-manager}"
SERVICE_NAME="${VPS_MANAGER_SVC:-vps-manager}"
BRANCH="${GIT_BRANCH:-main}"

cd "$APP_DIR"

# 输出当前运行版本号（语义版本 + git 短哈希），便于比对本地与线上是否一致
print_version() {
  local semver commit
  semver=$(cat VERSION 2>/dev/null | tr -d '[:space:]')
  [ -z "$semver" ] && semver="dev"
  commit=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
  echo "[$(date '+%F %T')] 当前版本: v${semver} (${commit})"
}

# 同步 systemd 单元文件：deploy/ 下的 .service/.timer 与 /etc/systemd/system
# 不一致时拷贝并 reload；timer 变更额外 restart 使新调度周期立即生效。
# 每次都执行（而非仅版本更新时），保证单元变更不依赖代码变更触发。
sync_units() {
  local changed=0 f base
  for f in "$APP_DIR"/deploy/*.service "$APP_DIR"/deploy/*.timer; do
    [ -f "$f" ] || continue
    base=$(basename "$f")
    if ! cmp -s "$f" "/etc/systemd/system/$base"; then
      cp "$f" "/etc/systemd/system/$base"
      echo "[$(date '+%F %T')] 单元已更新: $base"
      changed=1
      case "$base" in
        *.timer) systemctl restart "$base" 2>/dev/null || true ;;
      esac
    fi
  done
  if [ "$changed" -eq 1 ]; then
    systemctl daemon-reload
    echo "[$(date '+%F %T')] systemd 单元同步完成"
  fi
}

sync_units

git fetch -q origin "$BRANCH"

LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse "origin/$BRANCH")

if [ "$LOCAL" = "$REMOTE" ]; then
  echo "[$(date '+%F %T')] 代码已是最新，无需更新"
  print_version
  exit 0
fi

echo "[$(date '+%F %T')] 检测到新版本: ${LOCAL:0:8} -> ${REMOTE:0:8}"
# 部署节点始终与远端完全一致：reset --hard 丢弃任何本地变更（含文件 mode 变化），
# 避免 cc1 上误改文件导致 pull 拒绝合并、更新链路卡死
git reset --hard -q "origin/$BRANCH"

# 依赖如有变更自动安装（无变化时 pip 会快速跳过）
if [ -x ".venv/bin/pip" ]; then
  .venv/bin/pip install -q -r requirements.txt 2>/dev/null || true
fi

# 重启服务加载新代码
systemctl restart "$SERVICE_NAME"
echo "[$(date '+%F %T')] 已重启 $SERVICE_NAME 服务"
print_version
