#!/bin/bash
# ============================================
#  Hermes 调试快照工具 · debug-snapshot
#  一键抓取系统状态 → 打包为 .tar.gz
#  用法: bash debug-snapshot.sh [output_dir]
#
#  出bug时先跑这个，把 .tar.gz 发给助手
#  不要问用户"描述一下bug"——用户的原则是：
#  "修bug最关键的是定位问题"
# ============================================

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 / /mnt/c 2>/dev/null || 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"; echo ""
  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. 搜索 API 日志 + 实时检测
# ───────────────────────────────────────────
info "采集搜索 API 日志..."
for dir in "/home/ubuntu/files/search-ui/logs" "/home/ubuntu/files/logs" "/home/ubuntu/logs" "/tmp"; do
  if [ -d "$dir" ]; then
    for f in "$dir"/search-api* "$dir"/search_*log "$dir"/uvicorn*; do
      [ -f "$f" ] && cp "$f" "$OUT_DIR/" 2>/dev/null || true
    done
  fi
done

if command -v journalctl &>/dev/null; then
  API_PID=$(pgrep -f search_api 2>/dev/null || echo "")
  [ -n "$API_PID" ] && journalctl --no-pager -n 200 _PID="$API_PID" 2>/dev/null > "$OUT_DIR/api-journal.txt" || true
fi

{
  echo "=== Health Check ==="
  curl -s --max-time 5 http://127.0.0.1:8900/health 2>&1 || echo "HEALTH_CHECK_FAILED"
  echo ""; echo "=== Stats ==="
  curl -s --max-time 5 http://127.0.0.1:8900/api/stats 2>&1 || echo "STATS_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"
ok "API 状态 / 日志"

# ───────────────────────────────────────────
#  4. Caddy 日志
# ───────────────────────────────────────────
info "采集 Caddy 日志..."
if command -v journalctl &>/dev/null; then
  CADDY_PID=$(pgrep -x caddy 2>/dev/null || echo "")
  [ -n "$CADDY_PID" ] && 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 || true; done
done
curl -s --max-time 5 http://127.0.0.1:2019/config/ 2>&1 | head -c 2000 > "$OUT_DIR/04-caddy-config-live.txt" 2>/dev/null || echo "CADDY_ADMIN_API_NOT_AVAILABLE" > "$OUT_DIR/04-caddy-config-live.txt"
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/Key\s*["'"'"'][^"'"'"']*["'"'"']/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. ChromaDB 索引状态
# ───────────────────────────────────────────
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 "=== Collections ==="; find "$CHROMA_DIR" -name "*.bin" -o -name "*.parquet" 2>/dev/null | head -20; echo ""
  echo "=== DB Files ==="
  find "$CHROMA_DIR" -maxdepth 2 -type f \( -name "*.sqlite3" -o -name "*.db" \) 2>/dev/null | while read -r db; do ls -lh "$db"; done
} > "$OUT_DIR/05-chroma-status.txt"
# Try API stats
{
  curl -s --max-time 5 http://127.0.0.1:8900/api/stats 2>&1 | head -c 1000 || echo "STATS API NOT AVAILABLE"
  echo ""; echo "=== File count in search path ==="
  find /home/ubuntu/files -maxdepth 3 -type f \( -name "*.md" -o -name "*.txt" -o -name "*.py" \) 2>/dev/null | wc -l
} >> "$OUT_DIR/05-chroma-status.txt"
ok "索引状态"

# ───────────────────────────────────────────
#  7. 网络/连通性
# ───────────────────────────────────────────
info "采集网络状态..."
{
  echo "=== Funnel / Tunnel ==="
  curl -s --max-time 5 http://127.0.0.1:2020/ 2>&1 | head -c 500 || echo "FUNNEL_NOT_RESPONDING"
  echo ""; 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 "indexer*.log" -o -name "index*.log" 2>/dev/null | while read -r f; do
    echo "--- $f (last 20 lines) ---"; tail -20 "$f"
  done
} > "$OUT_DIR/07-recent-changes.txt"
ok "文件变更记录"

# ───────────────────────────────────────────
#  9. 打包
# ───────────────────────────────────────────
echo ""
info "打包中..."
tar -czf "$ARCHIVE" -C "$(dirname "$OUT_DIR")" "$(basename "$OUT_DIR")" 2>/dev/null

echo ""
echo -e "${GREEN}══════════════════════════════════════════════${NC}"
echo -e "${GREEN}  ✅ 调试快照已生成${NC}"
echo -e "${GREEN}  📦 ${ARCHIVE}${NC}"
echo -e "${GREEN}  📏 $(du -h "$ARCHIVE" | cut -f1)${NC}"
echo -e "${GREEN}══════════════════════════════════════════════${NC}"
echo ""
echo "用法: 把这个 .tar.gz 文件发给助手，就能秒级定位问题"
echo ""

rm -rf "$OUT_DIR"
