#!/bin/bash
# ============================================
#  Hermes 调试快照工具 · debug-snapshot.sh
#  一键抓取系统状态 → 打包为 .tar.gz
#  用法: bash debug-snapshot.sh [output_dir]
# ============================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUT_DIR="${1:-/tmp/hermes-debug-$TIMESTAMP}"
ARCHIVE="/tmp/hermes-debug-${TIMESTAMP}.tar.gz"

mkdir -p "$OUT_DIR"

RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; NC='\033[0m'
ok()   { echo -e " ${GREEN}✓${NC} $1"; }
info() { echo -e " ${CYAN}→${NC} $1"; }
fail() { echo -e " ${RED}✗${NC} $1"; }

# ── 1. 系统状态概览 ──
info "采集系统状态..."
{ echo "=== UPTIME ==="; uptime; echo ""; echo "=== CPU & MEMORY ==="; free -h; echo ""; echo "=== DISK ==="; df -h /; echo ""; echo "=== TOP PROCESSES (CPU) ==="; ps aux --sort=-%cpu | head -15; } > "$OUT_DIR/01-system.txt"
ok "系统状态"

# ── 2. 关键进程状态 ──
info "采集进程状态..."
{
  echo "=== Caddy ==="; pgrep -a caddy || echo "NOT RUNNING"
  echo ""; echo "=== Search API (port 8900) ==="; ss -tlnp | grep 8900 || echo "NOT LISTENING"
  pgrep -a python3 | grep search_api || echo "NOT RUNNING"
  echo ""; echo "=== ALL Python processes ==="; ps aux | grep python3 | grep -v grep || echo "none"
} > "$OUT_DIR/02-processes.txt"
ok "进程状态"

# ── 3. Search API 实时检查 ──
info "采集 API 状态..."
{
  echo "=== API Health Check ==="
  curl -s --max-time 5 http://127.0.0.1:8900/health 2>&1 || echo "HEALTH CHECK FAILED"
  echo ""; echo "=== Search Test ==="
  curl -s --max-time 5 "http://127.0.0.1:8900/api/search?q=test" 2>&1 | head -c 2000 || echo "SEARCH FAILED"
} > "$OUT_DIR/03-api-live-check.txt"

# Try to find API logs
for dir in /home/ubuntu/files/logs /home/ubuntu/logs /tmp; do
  [ -d "$dir" ] && for f in "$dir"/search-api* "$dir"/search_*log "$dir"/uvicorn*; do
    [ -f "$f" ] && cp "$f" "$OUT_DIR/" 2>/dev/null || true
  done
done
ok "API 状态"

# ── 4. Caddy 日志 ──
info "采集 Caddy 日志..."
{
  echo "=== Caddy config ==="
  curl -s --max-time 5 http://127.0.0.1:2019/config/ 2>&1 | head -c 2000 || echo "CADDY ADMIN API NOT AVAILABLE"
} > "$OUT_DIR/04-caddy-config.txt"
CADDY_PID=$(pgrep -x caddy 2>/dev/null || echo "")
if [ -n "$CADDY_PID" ] && command -v journalctl &>/dev/null; then
  journalctl --no-pager -n 100 _PID="$CADDY_PID" 2>/dev/null > "$OUT_DIR/04-caddy-log.txt" || true
fi
for dir in /var/log/caddy /home/ubuntu/logs; do
  [ -d "$dir" ] && for f in "$dir"/caddy*; do [ -f "$f" ] && cp "$f" "$OUT_DIR/" 2>/dev/null; done
done
ok "Caddy 日志"

# ── 5. 配置文件快照（脱敏） ──
info "采集配置文件..."
CONFIG_FILES=("/home/ubuntu/files/Caddyfile" "/home/ubuntu/files/search-ui/search_api.py" "/home/ubuntu/files/indexer.py")
for f in "${CONFIG_FILES[@]}"; do
  if [ -f "$f" ]; then
    sed 's/token\s*=\s*["'"'"'][^"'"'"']*["'"'"']/token = "REDACTED"/g;
         s/api[-_]\?key\s*=\s*["'"'"'][^"'"'"']*["'"'"']/api_key = "REDACTED"/g;
         s/ghp_[A-Za-z0-9]*/ghp_REDACTED/g;
         s/sk-[A-Za-z0-9]*/sk-REDACTED/g' "$f" > "$OUT_DIR/config-$(basename "$f").txt"
    ok "  $(basename "$f")"
  else
    fail "  $(basename "$f") NOT FOUND"
  fi
done

# ── 6. 索引 / 数据库状态 ──
info "采集索引状态..."
CHROMA_DIR="/home/ubuntu/files/chroma_db"
{
  echo "=== ChromaDB Size ==="; du -sh "$CHROMA_DIR" 2>/dev/null || echo "chroma_db/ NOT FOUND"
  echo ""; echo "=== ChromaDB Structure ==="; ls -la "$CHROMA_DIR/" 2>/dev/null || true
  echo ""; echo "=== Index files ==="
  find "$CHROMA_DIR" -maxdepth 2 -type f \( -name "*.bin" -o -name "*.parquet" -o -name "*.sqlite3" -o -name "*.db" \) 2>/dev/null | head -20
} > "$OUT_DIR/05-chroma-status.txt"
# Also query API stats
curl -s --max-time 5 http://127.0.0.1:8900/api/stats 2>&1 >> "$OUT_DIR/05-chroma-status.txt" || true
ok "索引状态"

# ── 7. 网络状态 ──
info "采集网络状态..."
{
  echo "=== Local Ports ==="; ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null || true
  echo ""; echo "=== Connectivity ==="
  ping -c 1 -W 2 github.com 2>&1 || echo "github.com UNREACHABLE"
  ping -c 1 -W 2 baidu.com 2>&1 || echo "baidu.com UNREACHABLE"
} > "$OUT_DIR/06-network.txt"
ok "网络状态"

# ── 8. 最近文件变更 ──
info "采集最近文件变更..."
{
  echo "=== New/Modified files in last 24h ==="
  find /home/ubuntu/files -maxdepth 2 -type f -mtime -1 2>/dev/null | sort
  echo ""; echo "=== Indexer logs ==="
  find /home/ubuntu/files -maxdepth 1 -name "*index*.log" 2>/dev/null | while read -r f; do echo "--- $f (last 20) ---"; tail -20 "$f"; done
} > "$OUT_DIR/07-recent-changes.txt"
ok "文件变更"

# ── 打包 ──
echo ""; info "打包中..."
tar -czf "$ARCHIVE" -C "$(dirname "$OUT_DIR")" "$(basename "$OUT_DIR")" 2>/dev/null
echo ""; echo -e "${GREEN}✅ 快照已生成: ${ARCHIVE}${NC}"
rm -rf "$OUT_DIR"
