#!/usr/bin/env bash

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

set -Eeuo pipefail

BACKUP_ROOT=/home/admin/backups/sub2api
SCRIPT_PATH=/home/admin/docker-projects/sub2api/deploy/backup-complete.sh
CRON_EXPECT='0 3 * * * /home/admin/docker-projects/sub2api/deploy/backup-complete.sh >> /home/admin/backups/sub2api/cron.log 2>&1'

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"
}

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 "cron 配置"
CRON_CONTENT="$(crontab -l 2>/dev/null || true)"
printf '%s\n' "$CRON_CONTENT"
status_line cron_expected_present "$([[ "$CRON_CONTENT" == *"$CRON_EXPECT"* ]] && echo yes || echo no)"

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
