#!/usr/bin/env bash
# ============================================================
#  به‌روزرسانی با یک دستور: نسخه‌ی جدید رو جایگزین می‌کنه و ربات رو دوباره راه می‌ندازه
#     bash update.sh                  ← جدیدترین فایل *.zip داخل همین پوشه
#     bash update.sh traderpro-final.zip
#  مراحل: بکاپ دیتابیس‌ها و کدها ← توقف ربات قدیمی ← اکسترکت نسخه‌ی جدید ← بررسی سلامت ← اجرا.
#  اگه نسخه‌ی جدید مشکل ساختاری داشته باشه، خودکار به نسخه‌ی قبلی برمی‌گرده.
# ============================================================
cd "$(dirname "$0")" || exit 1
PHP_BIN="${PHP_BIN:-php}"
command -v "$PHP_BIN" >/dev/null 2>&1 || { echo "❌ php پیدا نشد (PHP_BIN=/مسیر/php bash update.sh)"; exit 1; }

ZIP="${1:-$(ls -t ./*.zip 2>/dev/null | head -1)}"
[ -n "$ZIP" ] && [ -f "$ZIP" ] || { echo "❌ فایل زیپ پیدا نشد. اول زیپ نسخه‌ی جدید رو داخل همین پوشه آپلود کنید."; exit 1; }
echo "📦 نسخه‌ی جدید: $ZIP"

STAMP="$(date +%Y%m%d-%H%M%S)"
BK="backups/pre-update/$STAMP"
mkdir -p "$BK"

# ۱) بکاپ: دیتابیس‌ها (به‌همراه فایل‌های WAL) و کدها
for f in traderpro.db traderpro.db-wal traderpro.db-shm traderpro-financial.db traderpro-financial.db-wal traderpro-financial.db-shm .env .secrets.env; do
    [ -f "$f" ] && cp -a "$f" "$BK/"
done
tar czf "$BK/code.tgz" --exclude=backups --exclude='*.zip' --exclude='*.db*' --exclude='*.log' . 2>/dev/null
echo "💾 بکاپ در $BK"

# ۲) توقف ربات قدیمی (اول نگهبان، وگرنه ربات رو دوباره بالا میاره)
pkill -u "$(id -u)" -f "traderpro-supervisor\.sh" 2>/dev/null
if pgrep -u "$(id -u)" -f "traderpro\.php" >/dev/null 2>&1; then
    echo "⏹  توقف ربات قدیمی..."
    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

# ۳) اکسترکت (unzip، یا python3، یا خودِ PHP)
extract() {
    if command -v unzip >/dev/null 2>&1; then unzip -o -q "$ZIP"
    elif command -v python3 >/dev/null 2>&1; then python3 -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1]).extractall('.')" "$ZIP"
    else "$PHP_BIN" -r '$z=new ZipArchive; if($z->open($argv[1])!==true) exit(1); $z->extractTo("."); $z->close();' "$ZIP"
    fi
}
extract || { echo "❌ اکسترکت ناموفق بود. ربات قبلی دست‌نخورده مونده؛ اجراش می‌کنم."; bash run.sh; exit 1; }
chmod +x run.sh update.sh 2>/dev/null

# ۴) بررسی سلامت نسخه‌ی جدید (سینتکس فایل‌های اصلی)؛ در صورت خطا، بازگشت به نسخه‌ی قبلی
BAD=0
for f in traderpro.php api.php bootstrap.php fin-core.php trade-core.php graphics.php brand.php bonus-core.php bonus-texts.php jalali.php market-hours.php rules-texts.php promo-tool.php admin-plus.php insights-core.php lang-ux.php lang-full.php lang-phrases.php lang-overrides.php kyc-core.php withdraw-core.php admin-user.php admin-control.php user-control-core.php admin-pay.php track-core.php card-core.php contract-core.php contract-data/meta.php contract-data/shared.php contract-data/fa.php i18n-bridge.php lang-v3.php lang-permit.php permit-core.php admin-permit.php violations-core.php visuals.php account-audit.php tools/i18n-audit.php tools/i18n-admin-scope.php; do
    "$PHP_BIN" -l "$f" >/dev/null 2>&1 || { echo "❌ خطای سینتکس در $f"; BAD=1; }
done
# v2.9.4: فایل‌های قرارداد هر زبان (contract-data/<lc>.php) هم بررسی شوند
for f in contract-data/*.php; do
    [ -f "$f" ] && { "$PHP_BIN" -l "$f" >/dev/null 2>&1 || { echo "❌ خطای سینتکس در $f"; BAD=1; }; }
done
# v2.7.0: بازرسی چندزبانه — کلید جاافتاده/حروف فارسی در زبان غیرفارسی/placeholder خراب = بازگشت به نسخه‌ی قبلی
if [ "$BAD" = "0" ] && [ -f tools/i18n-audit.php ]; then
    if ! "$PHP_BIN" tools/i18n-audit.php --quiet; then
        echo "❌ بازرسی چندزبانه (tools/i18n-audit.php) خطا داد"
        BAD=1
    fi
fi
if [ "$BAD" = "1" ]; then
    echo "↩️  بازگشت به نسخه‌ی قبلی..."
    tar xzf "$BK/code.tgz" 2>/dev/null
    bash run.sh
    exit 1
fi

# ۵) اجرا (run.sh هر نمونه‌ی باقی‌مونده رو می‌بنده و ربات جدید رو در پس‌زمینه بالا میاره)
bash run.sh || exit 1
bash run.sh cron --quiet 2>/dev/null   # v2.4.4: کرون نگهبان (اگه هاست پردازه‌ها را بکشد، ربات خودکار روشن می‌شود)
echo "✅ به‌روزرسانی انجام شد. آخرین لاگ‌ها:"
tail -n 6 traderpro.log 2>/dev/null
echo "   (بکاپ قبل از آپدیت: $BK)"
