#!/usr/bin/env bash
# اجرای دائمی ربات در پس‌زمینه (بعد از بستن ترمینال هم کار می‌کنه):
#     bash run.sh
# اگه نسخه‌ی قبلی ربات در حال اجرا باشه، اول اون رو می‌بنده و بعد نسخه‌ی جدید رو اجرا می‌کنه.
# (اجرای ساده و مستقیم هم کار می‌کنه:  php traderpro.php  — فقط با بستن ترمینال متوقف می‌شه.)
cd "$(dirname "$0")" || exit 1

# v2.4.9 — فقط php از نوع CLI؛ در کرون PATH فرق دارد و «php» ممکن است cgi/fcgi باشد (STDOUT تعریف نبود و ربات کرش می‌کرد)
pick_php() {
    local c p
    for c in "$1" php /usr/local/bin/php /usr/bin/php /opt/cpanel/ea-php*/root/usr/bin/php /opt/alt/php*/usr/bin/php; do
        [ -n "$c" ] || continue
        p="$(command -v "$c" 2>/dev/null)" || continue
        [ "$("$p" -r 'echo PHP_SAPI;' 2>/dev/null)" = "cli" ] && { echo "$p"; return 0; }
    done
    command -v "$1" 2>/dev/null || echo "$1"
}
PHP_BIN="$(pick_php "${PHP_BIN:-php}")"
command -v "$PHP_BIN" >/dev/null 2>&1 || { echo "❌ php پیدا نشد. اگه مسیر خاصی داره: PHP_BIN=/مسیر/php bash run.sh"; exit 1; }

# توقف نگهبان و نسخه‌ی قبلی (فقط پردازه‌های همین کاربر)
stop_all() {
    pkill -u "$(id -u)" -f "traderpro-supervisor\.sh" 2>/dev/null
    sleep 1
    if pgrep -u "$(id -u)" -f "traderpro\.php" >/dev/null 2>&1; then
        pkill -u "$(id -u)" -f "traderpro\.php" 2>/dev/null
        for _ in $(seq 1 20); do
            pgrep -u "$(id -u)" -f "traderpro\.php" >/dev/null 2>&1 || break
            sleep 0.5
        done
        pkill -9 -u "$(id -u)" -f "traderpro\.php" 2>/dev/null
    fi
}
if [ "$1" = "stop" ]; then stop_all; echo "⏹  ربات و نگهبان متوقف شدند."; exit 0; fi
# v2.4.4 — حالت «ensure» برای کرون: اگه ربات/نگهبان نیست روشنش می‌کنه، وگرنه هیچ کاری نمی‌کنه (بی‌صدا و بی‌خطر برای اجرای مکرر)
if [ "$1" = "ensure" ]; then
    if pgrep -u "$(id -u)" -f "traderpro\.php" >/dev/null 2>&1 || pgrep -u "$(id -u)" -f "traderpro-supervisor\.sh" >/dev/null 2>&1; then exit 0; fi
    echo "[$(date '+%F %T')] cron-watchdog: ربات خاموش بود؛ روشن شد" >> traderpro.out
    nohup env PHP_BIN="$PHP_BIN" bash traderpro-supervisor.sh >/dev/null 2>&1 &
    exit 0
fi
# v2.4.4 — نصب خودکار کرون (هر ۵ دقیقه + بعد از ریبوت سرور). چندبار اجرا شود، فقط یک خط می‌ماند.
if [ "$1" = "cron" ]; then
    DIR="$(pwd)"
    if ! command -v crontab >/dev/null 2>&1; then
        echo "⚠️ دستور crontab در این هاست نیست. در cPanel → Cron Jobs یک کرون هر ۵ دقیقه با این دستور بسازید:"
        echo "   cd $DIR && bash run.sh ensure >/dev/null 2>&1"; exit 0
    fi
    TMP="$(mktemp)"; crontab -l 2>/dev/null | grep -v "traderpro-watchdog" > "$TMP"
    echo "*/5 * * * * cd $DIR && PHP_BIN=$PHP_BIN bash run.sh ensure >/dev/null 2>&1 # traderpro-watchdog" >> "$TMP"
    echo "@reboot cd $DIR && PHP_BIN=$PHP_BIN bash run.sh ensure >/dev/null 2>&1 # traderpro-watchdog" >> "$TMP"
    if crontab "$TMP"; then [ "$2" = "--quiet" ] || echo "✅ نگهبان کرون نصب شد: هر ۵ دقیقه چک می‌شود و اگر ربات خاموش باشد روشن می‌شود."
    else echo "⚠️ نصب کرون ممکن نشد. دستی در cPanel → Cron Jobs: cd $DIR && bash run.sh ensure >/dev/null 2>&1 (هر ۵ دقیقه)"; fi
    rm -f "$TMP"; exit 0
fi
stop_all

# نگهبان: اگه ربات بمیره خودش دوباره اجراش می‌کنه
nohup env PHP_BIN="$PHP_BIN" bash traderpro-supervisor.sh >/dev/null 2>&1 &
UP=0
for _ in $(seq 1 15); do   # تا ۱۵ ثانیه صبر می‌کنیم (استارت روی شبکه‌ی کند ممکنه چند ثانیه طول بکشه)
    sleep 1
    if pgrep -u "$(id -u)" -f "traderpro\.php" >/dev/null 2>&1; then UP=1; break; fi
done
if [ "$UP" = "1" ]; then
    echo "✅ ربات با نگهبان خودکار اجرا شد (PID $(pgrep -u "$(id -u)" -f "traderpro\.php" | head -1))."
    echo "   لاگ لحظه‌ای:  tail -f traderpro.log"
    echo "   توقف کامل:    bash run.sh stop"
else
    echo "❌ ربات بالا نیومد. علت:"
    tail -n 15 traderpro.out
    exit 1
fi
