#!/usr/bin/env bash
# 只回滚 api / player / admin 镜像 tag，不自动恢复数据库。

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=scripts/deploy-lib.sh
source "$SCRIPT_DIR/deploy-lib.sh"

TARGET_TAG=""
SKIP_BACKUP=false
ALLOW_DEFAULT_SECRETS=false

usage() {
  cat <<'EOF'
用法: scripts/rollback.sh --to TAG [选项]

默认流程：
  1. 检查 .env.docker
  2. 确认本机存在 thebet365-api/player/admin:TAG
  3. 备份 PostgreSQL 与 uploads 到 ./backups
  4. 将 api / player / admin 切回指定 TAG
  5. 等待健康检查并记录发布状态

注意:
  本脚本只回滚镜像，不回滚数据库结构或数据。
  如果目标版本涉及不可逆迁移，必须先按备份文件手工恢复数据库。

选项:
  --to TAG                 目标镜像 tag，必填
  --no-backup              跳过 PostgreSQL 与 uploads 备份
  --allow-default-secrets  允许 .env.docker 使用示例密钥，仅测试环境使用
  -h, --help               显示帮助

示例:
  ./scripts/rollback.sh --to v1.2.2
EOF
}

while [ $# -gt 0 ]; do
  case "$1" in
    --to)
      TARGET_TAG="${2:?缺少 --to 参数值}"
      shift 2
      ;;
    --no-backup)
      SKIP_BACKUP=true
      shift
      ;;
    --allow-default-secrets)
      ALLOW_DEFAULT_SECRETS=true
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      die "未知参数: $1"
      ;;
  esac
done

[ -n "$TARGET_TAG" ] || die "缺少 --to TAG"
set_deploy_image_tag "$TARGET_TAG"

cd "$ROOT"
require_docker
ensure_env_file || exit 1
validate_prod_env "$ALLOW_DEFAULT_SECRETS"
require_images_for_current_tag

start_infra

if [ "$SKIP_BACKUP" = false ]; then
  backup_database "pre-rollback"
  backup_uploads "pre-rollback"
  prune_old_backups
else
  warn "已跳过 PostgreSQL 与 uploads 备份"
fi

log "回滚 api / player / admin 到 tag: $(current_image_tag)"
compose up -d api player admin
wait_for_stack_ready
show_prisma_status
compose ps
persist_image_tag
record_release_state "rollback"
warn "镜像已回滚；数据库未自动恢复。若此次回滚涉及不可逆迁移，请按备份文件手工恢复数据库。"
print_stack_urls
