#!/usr/bin/env bash
# =============================================================================
# onx-panel-deploy — Panel code deployment helper (composer + vite + cache +
#                     FPM + queue + smoke test) tek komutta.
#
# Kullanım (sunucuda, root):
#   /usr/local/onoxsoft/bin/onx-panel-deploy [--skip-build] [--skip-test] [--quiet]
#
# Yaptıkları (sıralı):
#   1. composer dump-autoload --optimize      (yeni Controller/Service class'ları)
#   2. npm run build                          (Vue/Inertia değişiklikleri)
#   3. php artisan config:clear + view:clear + route:clear
#   4. systemctl restart php82-php-fpm        (OPCache flush — yeni autoload)
#   5. systemctl restart onoxsoft-queue       (Queue worker yeni Job class'ları)
#      veya onoxsoft-horizon (Horizon kurulu ise)
#   6. Smoke test: panel HTTPS + 1 customer vhost (HTTP 200/30x bekler)
#
# Exit codes:
#   0  — başarılı (tüm adımlar OK + smoke PASS)
#   1  — composer dump-autoload fail
#   2  — npm run build fail
#   3  — artisan cache:clear fail
#   4  — FPM restart fail (kritik — panel offline olabilir)
#   5  — queue restart fail (kritik değil ama warn)
#   6  — smoke test fail (panel deploy oldu ama HTTP cevap vermiyor)
#
# Flags:
#   --skip-build   npm run build atla (sadece backend değişiklikleri varsa)
#   --skip-test    smoke test atla (hızlı deploy için)
#   --quiet        verbose log azalt (CI/CD için)
#
# Deployed to: /usr/local/onoxsoft/bin/onx-panel-deploy
# v77.4 (DevOps): multi-webserver dağıtım sırasında pkill/manual command zinciri
#                 yerine tek script — production deploy automation.
# =============================================================================

set -uo pipefail

# ── Constants ────────────────────────────────────────────────────────────────
ONOX_HOME="${ONOX_HOME:-/opt/onoxsoft}"
PHP_BIN="${PHP_BIN:-/usr/bin/php82}"
[[ -x "${PHP_BIN}" ]] || PHP_BIN="/usr/bin/php"

PANEL_URL="${PANEL_URL:-https://panel.onoxsoft.com.tr:666}"
SMOKE_HOST="${SMOKE_HOST:-}"   # opsiyonel: customer vhost smoke için domain

# ── Flag parse ───────────────────────────────────────────────────────────────
SKIP_BUILD=0
SKIP_TEST=0
QUIET=0
for arg in "$@"; do
    case "$arg" in
        --skip-build) SKIP_BUILD=1 ;;
        --skip-test)  SKIP_TEST=1  ;;
        --quiet)      QUIET=1      ;;
        *)            echo "Unknown flag: $arg" >&2; exit 1 ;;
    esac
done

log() { [[ $QUIET -eq 0 ]] && echo "[onx-deploy] $*" >&2; }
err() { echo "[onx-deploy ERROR] $*" >&2; }

# ── Preflight ────────────────────────────────────────────────────────────────
[[ -d "${ONOX_HOME}" ]] || { err "Panel dizini yok: ${ONOX_HOME}"; exit 1; }
cd "${ONOX_HOME}" || exit 1

log "Panel dir: ${ONOX_HOME}"
log "PHP: ${PHP_BIN} ($(${PHP_BIN} -v | head -1))"

# ── 1. Composer dump-autoload ────────────────────────────────────────────────
log "1/6 composer dump-autoload --optimize..."
if ! composer dump-autoload --optimize 2>&1 | tail -3 >&2; then
    err "composer dump-autoload başarısız"
    exit 1
fi

# ── 2. Vite build ────────────────────────────────────────────────────────────
if [[ $SKIP_BUILD -eq 0 ]]; then
    log "2/6 npm run build (Vue/Inertia)..."
    if ! npm run build 2>&1 | tail -5 >&2; then
        err "npm run build başarısız"
        exit 2
    fi
else
    log "2/6 SKIP build (--skip-build)"
fi

# ── 3. Laravel cache clear ───────────────────────────────────────────────────
log "3/6 artisan cache clear..."
if ! "${PHP_BIN}" artisan config:clear 2>&1 | tail -1 >&2; then exit 3; fi
"${PHP_BIN}" artisan view:clear  2>&1 | tail -1 >&2 || true
"${PHP_BIN}" artisan route:clear 2>&1 | tail -1 >&2 || true

# ── 4. PHP-FPM restart (OPCache flush) ───────────────────────────────────────
log "4/6 php82-php-fpm restart (OPCache flush)..."
if ! systemctl restart php82-php-fpm 2>/dev/null; then
    err "php82-php-fpm restart başarısız — panel down olabilir"
    exit 4
fi

# ── 5. Queue worker restart (Job class'ları reload) ──────────────────────────
log "5/6 Queue worker restart (yeni Job class'ları)..."
if systemctl list-unit-files onoxsoft-horizon.service --no-legend 2>/dev/null | grep -q .; then
    QUEUE_SVC="onoxsoft-horizon"
elif systemctl list-unit-files onoxsoft-queue.service --no-legend 2>/dev/null | grep -q .; then
    QUEUE_SVC="onoxsoft-queue"
else
    log "  ⚠ Queue worker systemd unit yok — manuel pkill"
    pkill -f "artisan queue:work" 2>/dev/null || true
    QUEUE_SVC=""
fi

if [[ -n "$QUEUE_SVC" ]]; then
    if ! systemctl restart "${QUEUE_SVC}" 2>/dev/null; then
        err "Queue worker restart başarısız: ${QUEUE_SVC} (kritik değil, devam)"
        # exit 5  — non-fatal: panel çalışır, sadece Job class'lar eski olabilir
    fi
fi

# ── 6. Smoke test ────────────────────────────────────────────────────────────
if [[ $SKIP_TEST -eq 0 ]]; then
    log "6/6 Smoke test..."
    sleep 2

    # Panel smoke
    panel_code=$(curl -sk -o /dev/null -w "%{http_code}" "${PANEL_URL}/" --max-time 8 2>&1)
    log "  Panel ${PANEL_URL}: HTTP ${panel_code}"
    if [[ "${panel_code}" == "000" ]] || [[ "${panel_code}" -ge 500 ]]; then
        err "Panel smoke fail (HTTP ${panel_code}) — deploy bozuk olabilir"
        exit 6
    fi

    # Customer vhost smoke (opsiyonel)
    if [[ -n "${SMOKE_HOST}" ]]; then
        cust_code=$(curl -sk --resolve "${SMOKE_HOST}:443:127.0.0.1" \
            -o /dev/null -w "%{http_code}" \
            "https://${SMOKE_HOST}/" --max-time 8 2>&1)
        log "  Customer ${SMOKE_HOST}: HTTP ${cust_code}"
    fi
else
    log "6/6 SKIP smoke test (--skip-test)"
fi

log "✓ Deploy tamamlandı"
exit 0
