#!/usr/bin/env bash
# =============================================================================
# cron.sh — نگهداری زمان‌بندی‌شده روی هاست (ADR-R3) — هر دقیقه از cPanel:
#
#   * * * * * cd /home/USERNAME/api && bash cron.sh >> storage/logs/cron.log 2>&1
#
# بدون SSH؛ همه چیز از طریق Cron Jobs cPanel اجرا می‌شود.
# با flock جلوی اجرای هم‌زمان چند نسخه را می‌گیرد (روی هاست‌های اشتراکی
# بدون flock، از mkdir-lock استفاده می‌کنیم).
# =============================================================================

set -u

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOCK="$DIR/storage/framework/cron.lock"

# --- قفل ضد هم‌زمانی -------------------------------------------------------------
# mkdir اتمیک است: اگر جکشتن نشد یعنی نسخه قبلی هنوز در حال اجراست
if ! mkdir "$LOCK" 2>/dev/null; then
    AGE=$(( $(date +%s) - $(stat -c %Y "$LOCK" 2>/dev/null || echo 0) ))
    # قفل معلق قدیمی‌تر از ۳ دقیقه را بشکن (مثلاً بعد از kill سرور)
    [ "$AGE" -gt 180 ] && rm -rf "$LOCK" || exit 0
fi
trap 'rm -rf "$LOCK"' EXIT

PHP="php"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] cron cycle start"

# ۱) زمان‌بندی لاراول: prune ردیف‌های منقضی (tokenها/OTP/کش) + رویدادهای Outbox
$PHP "$DIR/artisan" schedule:run

# ۲) صف (درایور database) — حداکثر ۵۰ ثانیه کار در هر دقیقه
$PHP "$DIR/artisan" queue:work --stop-when-empty --max-time=50 --tries=1 2>/dev/null || true

echo "[$(date '+%Y-%m-%d %H:%M:%S')] cron cycle done"
