#!/usr/bin/env bash
#
# onx-php-list-installed — sistemde kurulu PHP versiyonlarını listeler
#
# Stdin:  JSON {} (input gereksiz)
# Stdout: JSON {
#           "versions": [
#             {"version":"7.4", "binary":"/usr/bin/php74", "fpm_unit":"php74-php-fpm",
#              "fpm_active":bool, "installed":bool, "patch":"7.4.33"},
#             ...
#           ]
#         }
# Exit:   0=ok
#
# Sudoers: apache ALL=(root) NOPASSWD: /usr/local/onoxsoft/bin/onx-php-list-installed
#
# RHEL/AlmaLinux 9 + Remi modular PHP konvansiyonu:
#   /usr/bin/php74, /usr/bin/php80, /usr/bin/php81, /usr/bin/php82, /usr/bin/php83, /usr/bin/php84
#   systemd unit: php<NN>-php-fpm.service
#
# Debian/Ubuntu (Sury repo):
#   /usr/bin/php7.4, /usr/bin/php8.1, ...
#   systemd unit: php<X.Y>-fpm.service
#
# Çıktı her iki ailede aynı şema — caller (PhpVersionRegistry) sadece versiyon ile çalışır.

set -euo pipefail

# v3.20: DYNAMIC version discovery
# Hardcoded liste kaldırıldı — PHP 8.5/8.6/9.0 release oldukça otomatik tespit.
# Strateji:
# 1. /usr/bin/php{N}{N} (Remi) ve /usr/bin/php{X.Y} (Sury) glob ile fiili binary'leri bul
# 2. dnf module list php (RHEL) ile mevcut sürümleri ekle (kurulu olmasa da)
# 3. Sonuçları birleştir, unique sort

# Distro family detection
DISTRO_FAMILY="rhel"
if [[ -f /etc/debian_version ]]; then
  DISTRO_FAMILY="debian"
fi

# Discover from filesystem (kurulu binary'ler)
declare -A FOUND_VERSIONS=()

if [[ "$DISTRO_FAMILY" == "rhel" ]]; then
    # Remi: /usr/bin/php{N}{N} format (e.g., php74, php82, php84)
    # v3.20: filesystem glob — INSTANT (no dnf call)
    for bin in /usr/bin/php[0-9][0-9]; do
        [[ -x "$bin" ]] || continue
        name=$(basename "$bin")
        ver_nodot="${name#php}"
        # 74 → 7.4, 82 → 8.2
        if [[ "$ver_nodot" =~ ^([0-9])([0-9])$ ]]; then
            VER="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
            FOUND_VERSIONS[$VER]=1
        fi
    done

    # v3.21 FIX: dnf module list KALDIRILDI (60s timeout sebebi)
    # Filesystem glob zaten kurulu olanları tespit ediyor. Future PHP 8.5/8.6
    # için ek discovery dnf call gerektiriyor ama her sayfa load'da çağrılması
    # PERFORMANS ÖLDÜRÜCÜ. PhpVersionRegistry'nin KNOWN const'undan well-known
    # versiyonlar zaten gösterilebilir + install butonu var.
    #
    # Aktif olarak yüklü ana versiyonlar için en sağlam yol filesystem.
    # Kurulabilir versiyon listesi için ayrı sysapi script (php-versions-available)
    # uzun timeout ile çağrılabilir (kullanıcı "install" butonuna basınca).
    : # no-op, dnf module list kasıtlı olarak skip
else
    # Debian/Sury: /usr/bin/php{X.Y} format
    for bin in /usr/bin/php[0-9].[0-9]; do
        [[ -x "$bin" ]] || continue
        name=$(basename "$bin")
        VER="${name#php}"
        FOUND_VERSIONS[$VER]=1
    done
fi

# Eğer hiç bulunamadıysa, well-known versiyonları fallback olarak ara (kurulu kontrol için)
if [[ ${#FOUND_VERSIONS[@]} -eq 0 ]]; then
    for V in 7.4 8.0 8.1 8.2 8.3 8.4 8.5 8.6 9.0; do
        FOUND_VERSIONS[$V]=1
    done
fi

# Sıralı array'e dönüştür
VERSIONS=()
while IFS= read -r v; do
    VERSIONS+=("$v")
done < <(printf '%s\n' "${!FOUND_VERSIONS[@]}" | sort -V)

json_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'; }

# JSON array başlat
printf '{"versions":['

FIRST=1
for VER in "${VERSIONS[@]}"; do
  VER_NODOT="${VER//./}"  # 7.4 → 74

  if [[ "$DISTRO_FAMILY" == "rhel" ]]; then
    BINARY="/usr/bin/php${VER_NODOT}"
    FPM_UNIT="php${VER_NODOT}-php-fpm"
  else
    BINARY="/usr/bin/php${VER}"
    FPM_UNIT="php${VER}-fpm"
  fi

  INSTALLED=false
  PATCH=""
  if [[ -x "$BINARY" ]]; then
    INSTALLED=true
    # Patch versiyonunu çek (örn: "PHP 8.2.31 (cli)" → "8.2.31")
    PATCH=$("$BINARY" -r 'echo PHP_VERSION;' 2>/dev/null | head -1 || true)
  fi

  # FPM unit aktif mi?
  FPM_ACTIVE=false
  if [[ "$INSTALLED" == "true" ]]; then
    if systemctl is-active --quiet "$FPM_UNIT" 2>/dev/null; then
      FPM_ACTIVE=true
    fi
  fi

  # Comma separator
  if [[ $FIRST -eq 0 ]]; then
    printf ','
  fi
  FIRST=0

  printf '{"version":"%s","binary":"%s","fpm_unit":"%s","fpm_active":%s,"installed":%s,"patch":"%s"}' \
    "$VER" \
    "$(json_escape "$BINARY")" \
    "$(json_escape "$FPM_UNIT")" \
    "$FPM_ACTIVE" \
    "$INSTALLED" \
    "$(json_escape "$PATCH")"
done

printf ']}\n'

exit 0
