#!/usr/bin/env bash
# فاز ۸/P1 — پرواز آماده؟ بررسی پیش‌نیازهای سرور واقعی پیش از استقرار پنل‌وینو
# استفاده: bash scripts/preflight.sh
set -u
RED='\033[0;31m'; GRN='\033[0;32m'; YLW='\033[1;33m'; NC='\033[0m'
PASS=0; WARN=0; FAIL=0
ok()  { echo -e "  ${GRN}✅ $1${NC}"; PASS=$((PASS+1)); }
wrn() { echo -e "  ${YLW}⚠️  $1${NC}"; WARN=$((WARN+1)); }
bad() { echo -e "  ${RED}❌ $1${NC}"; FAIL=$((FAIL+1)); }

echo -e "${YLW}── پیش‌پرواز پنل‌وینو ──${NC}"

# ۱) Node
NV=$(node -v 2>/dev/null | sed 's/v//;s/\..*//')
if [ -n "$NV" ] && [ "$NV" -ge 18 ]; then ok "Node v$NV (≥18)"; else bad "Node 18+ لازم است (یافت نشد)"; fi

# ۲) حافظه/دیسک
MEM=$(free -m 2>/dev/null | awk '/Mem:/{print $2}' || echo 0)
[ "$MEM" -ge 512 ] 2>/dev/null && ok "RAM: ${MEM}MB" || wrn "RAM کم (${MEM}MB) — حداقل پیشنهادی ۱GB"
FREE=$(df -m "$(dirname "$0")/.." 2>/dev/null | awk 'NR==2{print $4}')
[ "${FREE:-0}" -ge 1000 ] 2>/dev/null && ok "فضای آزاد: ${FREE}MB" || wrn "فضای آزاد کم (${FREE}MB)"

# ۳) کرل/پورت
command -v curl >/dev/null 2>&1 && ok "curl نصب است" || bad "curl نصب نیست"
if curl -sm 3 http://127.0.0.1:3000/api/health 2>/dev/null | grep -q '"ok":true'; then ok "پورت ۳۰۰۰ در حال سرویس (healthy)"; else wrn "پورت ۳۰۰۰ آزاد/پایین — برای نصب تازه عالی است؛ برای بررسی نسخه‌ی زنده اول راه‌اندازی کنید"; fi

# ۴) NAT/اینترنت خروجی
timeout 5 curl -s -o /dev/null -w '' https://api.telegram.org 2>/dev/null && ok "دسترسی خروجی به api.telegram.org" || wrn "خروجی به تلگرام بسته است — ربات/بکاپ/هشدار کار نمی‌کند"

# ۵) فایل‌های حیاتی
cd "$(dirname "$0")/.." 2>/dev/null
for f in src/server.js src/db.js package.json scripts/run-panel.sh; do [ -f "$f" ] && ok "فایل $f" || bad "فایل $f گم است"; done
[ -d node_modules ] && ok "node_modules نصب است" || wrn "npm install اجرا نشده"

# ۶) داکر (اختیاری)
command -v docker >/dev/null 2>&1 && ok "docker در دسترس (نصب با compose ممکن)" || wrn "docker نیست — نصب مستقیم با run-panel.sh ممکن است"

echo
echo -e "${YLW}نتیجه: ${GRN}${PASS} ✅${NC} / ${YLW}${WARN} ⚠️${NC} / ${RED}${FAIL} ❌${NC}"
[ "$FAIL" -eq 0 ] && exit 0 || exit 1
