#!/bin/bash
# health-check.sh — быстрый снимок состояния инфраструктуры rodnoy.site.
# Запускать НА СЕРВЕРЕ: bash /var/www/opt.rodnoy.site/admin/scripts/health-check.sh
# Выводит человеко-читаемую сводку + JSON в конец для парсинга.
#
# Что проверяет:
#   1. Маркетинг-сервис (порт 3040) — alive? БД отвечает?
#   2. nginx + SSL (осталось дней до истечения)
#   3. opt.rodnoy.site — главные страницы отдают 200
#   4. gb.rodnoy.site — комментарии читаются
#   5. CORS preflight с opt.rodnoy.site → app.rodnoy.site
#   6. DNS opt.rodnoy.site
#   7. Свободное место на диске
#   8. Uptime / load average
set -u

C_GREEN=$'\033[32m'; C_RED=$'\033[31m'; C_YELLOW=$'\033[33m'; C_CYAN=$'\033[36m'; C_RST=$'\033[0m'

ok()   { echo "  ${C_GREEN}✓${C_RST} $*"; }
fail() { echo "  ${C_RED}✗${C_RST} $*"; }
warn() { echo "  ${C_YELLOW}!${C_RST} $*"; }
hdr()  { echo; echo "${C_CYAN}━━ $* ━━${C_RST}"; }

echo "=========================================="
echo " rodnoy.site — health check"
echo " $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
echo "=========================================="

# 1) Marketing service
hdr "1 · Marketing service (port 3040)"
MARK_PID=$(pgrep -f "/home/deploy/.bun/bin/bun run src/index.ts" | head -1)
if [ -n "$MARK_PID" ]; then
  ETIME=$(ps -o etime= -p "$MARK_PID" | tr -d ' ')
  RSS=$(ps -o rss= -p "$MARK_PID" | tr -d ' ')
  ok "process running (PID $MARK_PID, uptime $ETIME, RSS $((RSS/1024)) MB)"
else
  fail "process NOT running (expected /home/deploy/.bun/bin/bun run src/index.ts)"
fi

HTTP_ROOT=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3040/ 2>/dev/null)
if [ "$HTTP_ROOT" = "200" ]; then ok "GET / -> 200"; else fail "GET / -> ${HTTP_ROOT:-000}"; fi

# БД через Prisma (запрос к эндпоинту)
HTTP_DB=$(curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:3040/api/comments/all?page=opt-plan" 2>/dev/null)
if [ "$HTTP_DB" = "200" ]; then ok "GET /api/comments/all -> 200 (БД ОК)"; else fail "GET /api/comments/all -> ${HTTP_DB:-000} (Prisma/БД проблема)"; fi

# .env presence
if [ -f /home/deploy/rodnoy-marketing-service/.env ]; then ok ".env exists"; else fail ".env missing"; fi
PW_HASH=$(grep "^DATABASE_URL=" /home/deploy/rodnoy-marketing-service/.env 2>/dev/null | sed -E 's|.*rodnoy:([^@]+)@.*|\1|' | sha256sum | cut -c1-8)
MAIN_HASH=$(sudo grep "^DATABASE_URL=" /home/deploy/GroupBy/.env 2>/dev/null | sed -E 's|.*rodnoy:([^@]+)@.*|\1|' | sha256sum | cut -c1-8)
if [ -n "$PW_HASH" ] && [ "$PW_HASH" = "$MAIN_HASH" ]; then
  ok ".env password matches main app (hash ${PW_HASH})"
else
  fail ".env password mismatch (marketing=${PW_HASH:-none} vs main=${MAIN_HASH:-none})"
fi

# 2) nginx + SSL
hdr "2 · nginx + SSL"
NGINX_ACTIVE=$(systemctl is-active nginx 2>/dev/null)
if [ "$NGINX_ACTIVE" = "active" ]; then ok "nginx active"; else fail "nginx: ${NGINX_ACTIVE}"; fi

SSL_END=$(echo | openssl s_client -servername opt.rodnoy.site -connect 127.0.0.1:443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
if [ -n "$SSL_END" ]; then
  DAYS=$(( ($(date -d "$SSL_END" +%s) - $(date +%s)) / 86400 ))
  if [ "$DAYS" -gt 14 ]; then ok "SSL cert expires $SSL_END ($DAYS days)"; else warn "SSL cert expires $SSL_END ($DAYS days) — renewal soon"; fi
else
  fail "cannot read SSL cert"
fi

# 3) opt.rodnoy.site pages
hdr "3 · opt.rodnoy.site — pages"
for page in index.html design.html admin/ai-context.html; do
  CODE=$(curl -s -o /dev/null -w "%{http_code}" "https://opt.rodnoy.site/$page" --resolve opt.rodnoy.site:443:127.0.0.1 2>/dev/null)
  if [ "$CODE" = "200" ]; then ok "/$page -> 200"; else warn "/$page -> ${CODE}"; fi
done

# 4) gb.rodnoy.site comments
hdr "4 · gb.rodnoy.site — comments (same service)"
HTTP_GB=$(curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:3040/api/comments/all?page=gb-plan" 2>/dev/null)
if [ "$HTTP_GB" = "200" ]; then ok "GET ?page=gb-plan -> 200"; else fail "GET ?page=gb-plan -> ${HTTP_GB:-000}"; fi

# 5) CORS preflight
hdr "5 · CORS preflight (opt.rodnoy.site -> app.rodnoy.site)"
CORS_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X OPTIONS \
  "http://127.0.0.1:3040/api/comments/all?page=opt-plan" \
  -H "Origin: https://opt.rodnoy.site" \
  -H "Access-Control-Request-Method: GET" 2>/dev/null)
if [ "$CORS_CODE" = "204" ]; then ok "OPTIONS -> 204 (CORS ОК)"; else fail "OPTIONS -> ${CORS_CODE:-000}"; fi

# 6) DNS
hdr "6 · DNS"
IP=$(getent hosts opt.rodnoy.site | awk '{print $1}' | head -1)
if [ "$IP" = "93.183.81.233" ]; then ok "opt.rodnoy.site -> $IP"; else warn "opt.rodnoy.site -> ${IP:-none} (expected 93.183.81.233)"; fi

# 7) Disk space
hdr "7 · Disk space"
df -h / | tail -1 | awk '{printf "  / : %s used (%s free of %s)\n", $5, $4, $2}'

# 8) System
hdr "8 · System"
echo "  uptime: $(uptime -p | sed 's/up //')"
echo "  load:   $(cat /proc/loadavg | awk '{print $1, $2, $3}')"

# JSON snapshot (для парсинга AI)
hdr "JSON snapshot"
{
  echo '{'
  echo '  "ts": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",'
  echo '  "marketing": {'
  echo '    "pid": "'"$MARK_PID"'",'
  echo '    "http_root": "'"$HTTP_ROOT"'",'
  echo '    "http_db": "'"$HTTP_DB"'",'
  echo '    "env_present": '$([ -f /home/deploy/rodnoy-marketing-service/.env ] && echo true || echo false)','
  echo '    "pw_hash_match": '$([ "$PW_HASH" = "$MAIN_HASH" ] && echo true || echo false)','
  echo '    "runtime_log": "/home/deploy/rodnoy-marketing-service/runtime.log"'
  echo '  },'
  echo '  "nginx": {'
  echo '    "active": "'"$NGINX_ACTIVE"'",'
  echo '    "ssl_expires": "'"$SSL_END"'",'
  echo '    "ssl_days_left": '"${DAYS:-null}"
  echo '  },'
  echo '  "sites": {'
  echo '    "opt_index": "'$(curl -s -o /dev/null -w "%{http_code}" --resolve opt.rodnoy.site:443:127.0.0.1 https://opt.rodnoy.site/index.html 2>/dev/null)'",'
  echo '    "opt_design": "'$(curl -s -o /dev/null -w "%{http_code}" --resolve opt.rodnoy.site:443:127.0.0.1 https://opt.rodnoy.site/design.html 2>/dev/null)'",'
  echo '    "opt_admin_ai_context": "'$(curl -s -o /dev/null -w "%{http_code}" --resolve opt.rodnoy.site:443:127.0.0.1 https://opt.rodnoy.site/admin/ai-context.html 2>/dev/null)'"'
  echo '  },'
  echo '  "cors_preflight_code": "'"$CORS_CODE"'",'
  echo '  "dns_opt_rodnoy_site": "'"$IP"'"'
  echo '}'
} | tee /tmp/health-check.json

echo
echo "JSON saved: /tmp/health-check.json"
