#!/usr/bin/env bash

# sub2api 完整备份状态检查脚本。
# 用途：
# 1. 快速确认 PostgreSQL / Redis 备份脚本是否配置到位
# 2. 输出最近一次备份产物、日志、summary 与 systemd 定时校验状态
# 3. 给人工巡检或自动化验收提供统一入口

set -Eeuo pipefail

BACKUP_ROOT=/home/admin/backups/sub2api
SCRIPT_PATH=/home/admin/docker-projects/sub2api/deploy/backup-complete.sh
VERIFY_TIMER=sub2api-redis-verify.timer
VERIFY_SERVICE=sub2api-redis-verify.service
VERIFY_STAMP_FILE="$BACKUP_ROOT/meta/redis-verify-last-date.txt"

log_section() {
  printf '\n===== %s =====\n' "$1"
}

latest_file() {
  local dir="$1"
  local pattern="$2"
  find "$dir" -maxdepth 1 -type f -name "$pattern" 2>/dev/null | sort | tail -1
}

status_line() {
  local key="$1"
  local value="$2"
  printf '%s=%s\n' "$key" "$value"
}

systemctl_safe() {
  systemctl "$@" 2>/dev/null || true
}

log_section "基础状态"
status_line script_exists "$([ -f "$SCRIPT_PATH" ] && echo yes || echo no)"
status_line backup_root_exists "$([ -d "$BACKUP_ROOT" ] && echo yes || echo no)"
status_line cron_log_exists "$([ -f "$BACKUP_ROOT/cron.log" ] && echo yes || echo no)"
status_line backup_log_exists "$([ -f "$BACKUP_ROOT/backup.log" ] && echo yes || echo no)"

log_section "Redis 每日校验调度"
status_line redis_verify_scheduler systemd_timer
status_line redis_verify_timer_exists "$([ -f "/etc/systemd/system/$VERIFY_TIMER" ] && echo yes || echo no)"
status_line redis_verify_service_exists "$([ -f "/etc/systemd/system/$VERIFY_SERVICE" ] && echo yes || echo no)"
status_line redis_verify_timer_enabled "$(systemctl_safe is-enabled "$VERIFY_TIMER")"
status_line redis_verify_timer_active "$(systemctl_safe is-active "$VERIFY_TIMER")"
status_line redis_verify_service_active "$(systemctl_safe is-active "$VERIFY_SERVICE")"
status_line redis_verify_timer_next "$(systemctl_safe show -p NextElapseUSecRealtime --value "$VERIFY_TIMER")"
status_line redis_verify_last_date "$(cat "$VERIFY_STAMP_FILE" 2>/dev/null || echo missing)"

log_section "运行态前提"
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' | (grep -E '(^NAMES|postgres|redis-base)' || true)

LATEST_BACKUP_DIR="$(find "$BACKUP_ROOT" -maxdepth 1 -type d -name 'backup-date-*' 2>/dev/null | sort | tail -1)"
status_line latest_backup_dir "${LATEST_BACKUP_DIR:-missing}"

if [ -n "${LATEST_BACKUP_DIR:-}" ] && [ -d "$LATEST_BACKUP_DIR" ]; then
  PG_FILE="$(latest_file "$LATEST_BACKUP_DIR/postgres" 'sub2api_*.sql.gz')"
  REDIS_FILE="$(latest_file "$LATEST_BACKUP_DIR/redis" 'dump_*.rdb')"
  SUMMARY_FILE="$(latest_file "$LATEST_BACKUP_DIR/meta" 'summary_*.txt')"
  MYSQL_STATUS_FILE="$(latest_file "$LATEST_BACKUP_DIR/meta" 'mysql-status_*.txt')"

  log_section "最近产物"
  status_line postgres_file "${PG_FILE:-missing}"
  status_line redis_file "${REDIS_FILE:-missing}"
  status_line summary_file "${SUMMARY_FILE:-missing}"
  status_line mysql_status_file "${MYSQL_STATUS_FILE:-missing}"

  if [ -n "${PG_FILE:-}" ] || [ -n "${REDIS_FILE:-}" ]; then
    ls -lh ${PG_FILE:+"$PG_FILE"} ${REDIS_FILE:+"$REDIS_FILE"} 2>/dev/null || true
  fi

  if [ -n "${SUMMARY_FILE:-}" ] && [ -f "$SUMMARY_FILE" ]; then
    log_section "最近 summary"
    cat "$SUMMARY_FILE"
  fi
else
  log_section "最近产物"
  echo "当前没有任何 backup-date-* 目录"
fi

for f in "$BACKUP_ROOT/backup.log" "$BACKUP_ROOT/cron.log"; do
  if [ -f "$f" ]; then
    log_section "日志尾部: $f"
    tail -n 40 "$f"
  fi
done
