#!/usr/bin/env bash
# onx-ols-rewrite-clean — OLS vhost rewrite rules'ı temiz canonical fall-through ile değiştir.
#
# SORUN: WordPress/CMS .htaccess'i onx-htaccess-translate ile çevrilirken LiteSpeed Cache
# blokları (<IfModule LiteSpeed>), cPanel php-ini direktifleri ve onlarca `#` yorum satırı
# OLS `rules <<<END_RULES ... END_RULES` bloğuna sızıyor. OLS'in rewrite parser'ı Apache'den
# katı: bu şişkin/desteklenmeyen blok parse edilirken TÜM ruleset düşüyor → doğru fall-through
# (`!-f/!-d → /index.php`) blokta görünse bile UYGULANMIYOR → `/` açılır (DirIndex index.php
# servis eder), `/iç-sayfa` → rewrite yok → 404.
#
# FIX: Hedef vhost(lar)ın rules bloğunu OLS'in KESIN parse ettiği canonical front-controller
# fall-through ile değiştir (suspend-marker + `!-f/!-d → /index.php`). WordPress/Laravel/Drupal
# vb. routing'i bunu tam karşılar; cache/expires/deflate'i OLS native yapar. Idempotent.
#
# Usage:
#   onx-ols-rewrite-clean <domain> [<domain>...]   # belirtilen domain(ler)
#   onx-ols-rewrite-clean --all                    # rules bloğu "şişmiş" TÜM WordPress vhost'ları
#
# Exit: 0=ok  1=kullanım hatası  2=lsws restart fail (geri alındı)

set -euo pipefail

VHOST_BASE="/usr/local/lsws/conf/vhosts"
LSWS_CTL="/usr/local/lsws/bin/lswsctrl"

[[ $# -ge 1 ]] || { echo "Usage: $0 <domain>... | --all" >&2; exit 1; }
[[ -x "${LSWS_CTL}" ]] || { echo "lswsctrl bulunamadı: ${LSWS_CTL}" >&2; exit 1; }

# ── Hedef vhconf.conf listesini topla ────────────────────────────────────────
declare -a CONFS=()

if [[ "$1" == "--all" ]]; then
  while IFS= read -r conf; do
    # Güvenli kapsam: yalnızca WordPress vhost'ları (rules'ta "BEGIN WordPress" izi).
    # Front-controller fall-through WP routing'i tam karşılar → kayıp yok.
    if awk '/rules[[:space:]]+<<<END_RULES/{f=1} f{print} /^[[:space:]]*END_RULES/{f=0}' "$conf" \
         | grep -q 'BEGIN WordPress'; then
      CONFS+=("$conf")
    fi
  done < <(find "${VHOST_BASE}" -maxdepth 2 -name vhconf.conf 2>/dev/null)
else
  for d in "$@"; do
    c=$(ls -d "${VHOST_BASE}"/*-"${d}"/vhconf.conf 2>/dev/null | head -1 || true)
    if [[ -n "${c}" ]]; then
      CONFS+=("${c}")
    else
      echo "uyarı: vhost bulunamadı: ${d}" >&2
    fi
  done
fi

if [[ ${#CONFS[@]} -eq 0 ]]; then
  echo "Hedef vhost yok (--all WordPress vhost bulamadı veya domain eşleşmedi)."
  exit 0
fi

# ── Patch ────────────────────────────────────────────────────────────────────
PATCHED=0
for conf in "${CONFS[@]}"; do
  vhdir=$(dirname "${conf}")
  vhname=$(basename "${vhdir}")
  marker="${vhdir}/.onx-suspended"

  status=$(MARKER="${marker}" python3 - "${conf}" <<'PYEOF'
import os, re, sys
conf = sys.argv[1]
marker = os.environ["MARKER"]
s = open(conf).read()

clean = (
    f"RewriteCond {marker} -f\n"
    "RewriteCond %{REQUEST_URI} !^/index\\.html$\n"
    "RewriteCond %{REQUEST_URI} !^/__onx-health$\n"
    "RewriteRule ^(.*)$ /index.html [L]\n"
    "RewriteCond %{REQUEST_FILENAME} !-f\n"
    "RewriteCond %{REQUEST_FILENAME} !-d\n"
    "RewriteRule ^(.*)$ /index.php [L]"
)

# context / içindeki tek `rules <<<END_RULES ... END_RULES` bloğunu değiştir.
new, n = re.subn(
    r'(rules\s+<<<END_RULES\n).*?(\nEND_RULES)',
    lambda m: m.group(1) + clean + m.group(2),
    s, count=1, flags=re.DOTALL,
)

if n and new != s:
    open(conf + ".bak.rewrite-clean", "w").write(s)
    open(conf, "w").write(new)
    print("PATCHED")
else:
    print("NOCHANGE")
PYEOF
)
  echo "  ${status}  ${vhname}"
  [[ "${status}" == "PATCHED" ]] && PATCHED=$((PATCHED+1))
done

echo "── ${PATCHED}/${#CONFS[@]} vhost güncellendi ──"

if [[ ${PATCHED} -eq 0 ]]; then
  echo "Değişiklik yok — restart atlanıyor."
  exit 0
fi

# ── lswsctrl restart (OLS vhost değişikliği için şart) ───────────────────────
echo "=== lswsctrl restart ==="
if ! "${LSWS_CTL}" restart; then
  echo "lswsctrl restart BAŞARISIZ — yedekleri geri alıyorum" >&2
  for conf in "${CONFS[@]}"; do
    [[ -f "${conf}.bak.rewrite-clean" ]] && mv -f "${conf}.bak.rewrite-clean" "${conf}"
  done
  "${LSWS_CTL}" restart || true
  exit 2
fi

echo "OK — ${PATCHED} vhost temiz rewrite ile yeniden yüklendi."
