#!/usr/bin/env bash
# onx-php-ext-list — Enumerate installed/available PHP extensions per version.
#
# v3.22 PERFORMANS REWRITE:
#   - INSTALLED: php -m + rpm -qa (instant — 10ms)
#   - AVAILABLE: rpm -qa ile karşılaştırılan curated POPULAR extension listesi
#     (dnf repoquery KALDIRILDI — 30dk+ timeout sebebiydi)
#   - Toplam çalışma süresi: ~50ms (önceden 60-1800sn)
#
# Background: dnf repoquery (remote remi-modular cache miss) ÇOK YAVAŞ.
# Production panel'inde her sayfa load'da 30dk+ beklemek kabul edilemez.
# Strategy: yaygın 60+ extension'ı hardcoded list olarak göster; user
# tıkladığında dnf install zaten gerçek paketi indirir (asıl yavaş kısım).
#
# Input (stdin JSON):
#   version  string   "8.3"
#
# Output (stdout JSON):
#   {
#     "version": "8.3",
#     "binary": "/usr/bin/php83",
#     "installed": [{"name":"core","state":"installed"}, ...],
#     "available": [{"name":"imagick","package_name":"php83-php-pecl-imagick","state":"available"}, ...]
#   }

set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
source "${SCRIPT_DIR}/_lib/common.sh"

INPUT=$(cat)
onx_require_json "${INPUT}"

VERSION=$(onx_json_get "${INPUT}" "version")

[[ -z "${VERSION}" ]] && onx_die 1 "version is required"
[[ "${VERSION}" =~ ^[7-9]\.[0-9]+$ ]] || onx_die 1 "version must be x.y"

VERSION_NODOT="${VERSION//./}"
BINARY="/usr/bin/php${VERSION_NODOT}"

[[ -x "${BINARY}" ]] || onx_die 2 "PHP ${VERSION} not installed"

# ── INSTALLED via php -m (10ms — INSTANT) ────────────────────────────────────
mapfile -t INSTALLED_RAW < <("${BINARY}" -m 2>/dev/null \
    | grep -vE '^\[|^$' | tr 'A-Z' 'a-z' | sort -u)

# ── INSTALLED'i RPM verisiyle zenginleştir (paket adı için) ──────────────────
# rpm -qa daha hızlı (~50ms) dnf repoquery yerine
declare -A RPM_INSTALLED=()
if command -v rpm >/dev/null 2>&1; then
    while IFS= read -r pkg; do
        [[ -z "$pkg" ]] && continue
        # php82-php-pecl-imagick-3.7.0-1.el9.remi.x86_64 → imagick
        ext_name="${pkg#php${VERSION_NODOT}-php-}"
        ext_name="${ext_name%%-*}"        # version suffix kaldır
        ext_name="${ext_name#pecl-}"       # pecl- prefix kaldır
        # Mevcut paket adından kayıt — install butonu için
        RPM_INSTALLED["$ext_name"]="$pkg"
    done < <(rpm -qa "php${VERSION_NODOT}-php-*" --queryformat '%{NAME}\n' 2>/dev/null | sort -u)
fi

# ── AVAILABLE: Curated popular extension list (instant, no dnf) ──────────────
# Bu liste Remi mod_php8x repo'sundaki yaygın ext'leri kapsar.
# Yeni ext gerekirse user dnf install <pkg> manuel yapabilir veya bu liste güncellenir.
POPULAR_EXTS=(
    # Database
    "redis:php${VERSION_NODOT}-php-pecl-redis5"
    "memcached:php${VERSION_NODOT}-php-pecl-memcached"
    "memcache:php${VERSION_NODOT}-php-pecl-memcache"
    "mongodb:php${VERSION_NODOT}-php-pecl-mongodb"
    "pdo_pgsql:php${VERSION_NODOT}-php-pgsql"
    "pgsql:php${VERSION_NODOT}-php-pgsql"
    "pdo_sqlite:php${VERSION_NODOT}-php-pdo"
    "sqlite3:php${VERSION_NODOT}-php-sqlite3"
    "pdo_dblib:php${VERSION_NODOT}-php-mssql"
    "pdo_odbc:php${VERSION_NODOT}-php-odbc"
    "interbase:php${VERSION_NODOT}-php-interbase"
    "oci8:php${VERSION_NODOT}-php-pecl-oci8"

    # Image / Graphics
    "imagick:php${VERSION_NODOT}-php-pecl-imagick"
    "gd:php${VERSION_NODOT}-php-gd"
    "gmagick:php${VERSION_NODOT}-php-pecl-gmagick"

    # Performance
    "apcu:php${VERSION_NODOT}-php-pecl-apcu"
    "apcu_bc:php${VERSION_NODOT}-php-pecl-apcu-bc"
    "igbinary:php${VERSION_NODOT}-php-pecl-igbinary"
    "msgpack:php${VERSION_NODOT}-php-pecl-msgpack"
    "lzf:php${VERSION_NODOT}-php-pecl-lzf"
    "zstd:php${VERSION_NODOT}-php-pecl-zstd"

    # Security
    "sodium:php${VERSION_NODOT}-php-sodium"
    "openssl:php${VERSION_NODOT}-php-openssl"
    "gmp:php${VERSION_NODOT}-php-gmp"
    "mcrypt:php${VERSION_NODOT}-php-pecl-mcrypt"

    # XML / Text
    "xml:php${VERSION_NODOT}-php-xml"
    "xmlrpc:php${VERSION_NODOT}-php-xmlrpc"
    "simplexml:php${VERSION_NODOT}-php-xml"
    "soap:php${VERSION_NODOT}-php-soap"
    "tidy:php${VERSION_NODOT}-php-tidy"
    "yaml:php${VERSION_NODOT}-php-pecl-yaml"
    "json:php${VERSION_NODOT}-php-json"

    # Networking
    "ldap:php${VERSION_NODOT}-php-ldap"
    "imap:php${VERSION_NODOT}-php-pecl-imap"
    "snmp:php${VERSION_NODOT}-php-snmp"
    "ssh2:php${VERSION_NODOT}-php-pecl-ssh2"
    "curl:php${VERSION_NODOT}-php-common"

    # I18N
    "intl:php${VERSION_NODOT}-php-intl"
    "gettext:php${VERSION_NODOT}-php-gettext"
    "mbstring:php${VERSION_NODOT}-php-mbstring"
    "iconv:php${VERSION_NODOT}-php-common"
    "enchant:php${VERSION_NODOT}-php-enchant"
    "pspell:php${VERSION_NODOT}-php-pspell"
    "recode:php${VERSION_NODOT}-php-recode"

    # Math
    "bcmath:php${VERSION_NODOT}-php-bcmath"

    # Process / System
    "pcntl:php${VERSION_NODOT}-php-process"
    "shmop:php${VERSION_NODOT}-php-process"
    "sysvmsg:php${VERSION_NODOT}-php-process"
    "sysvsem:php${VERSION_NODOT}-php-process"
    "sysvshm:php${VERSION_NODOT}-php-process"
    "posix:php${VERSION_NODOT}-php-process"

    # Dev / Debug
    "xdebug:php${VERSION_NODOT}-php-pecl-xdebug3"
    "opcache:php${VERSION_NODOT}-php-opcache"
    "phpdbg:php${VERSION_NODOT}-php-cli"
    "tideways_xhprof:php${VERSION_NODOT}-php-pecl-xhprof"

    # Archive / Compression
    "zip:php${VERSION_NODOT}-php-pecl-zip"
    "phar:php${VERSION_NODOT}-php-cli"
    "bz2:php${VERSION_NODOT}-php-bz2"
    "zlib:php${VERSION_NODOT}-php-common"

    # Modern Features
    "ffi:php${VERSION_NODOT}-php-ffi"
    "exif:php${VERSION_NODOT}-php-exif"
    "fileinfo:php${VERSION_NODOT}-php-fileinfo"

    # PECL & Other
    "swoole:php${VERSION_NODOT}-php-pecl-swoole5"
    "amqp:php${VERSION_NODOT}-php-pecl-amqp"
    "rdkafka:php${VERSION_NODOT}-php-pecl-rdkafka"
    "geoip:php${VERSION_NODOT}-php-pecl-geoip"
    "maxminddb:php${VERSION_NODOT}-php-pecl-maxminddb"
    "uuid:php${VERSION_NODOT}-php-pecl-uuid"
    "uopz:php${VERSION_NODOT}-php-pecl-uopz"
    "ev:php${VERSION_NODOT}-php-pecl-ev"
    "event:php${VERSION_NODOT}-php-pecl-event"
    "gnupg:php${VERSION_NODOT}-php-pecl-gnupg"
    "krb5:php${VERSION_NODOT}-php-pecl-krb5"
    "protobuf:php${VERSION_NODOT}-php-pecl-protobuf"
    "raphf:php${VERSION_NODOT}-php-pecl-raphf"
    "translit:php${VERSION_NODOT}-php-pecl-translit"
)

AVAILABLE=()
for entry in "${POPULAR_EXTS[@]}"; do
    ext_name="${entry%%:*}"
    pkg_name="${entry##*:}"
    # Already loaded in php -m?
    FOUND=0
    for ins in "${INSTALLED_RAW[@]}"; do
        [[ "${ins}" == "${ext_name}" ]] && FOUND=1 && break
    done
    [[ $FOUND -eq 0 ]] && AVAILABLE+=("${ext_name}|${pkg_name}")
done

# ── Build JSON ───────────────────────────────────────────────────────────────
# Installed: php -m sonuçları
INSTALLED_JSON='['
sep=''
for ext in "${INSTALLED_RAW[@]}"; do
    [[ -z "${ext}" ]] && continue
    pkg_name="${RPM_INSTALLED[$ext]:-}"
    if [[ -n "$pkg_name" ]]; then
        INSTALLED_JSON+="${sep}{\"name\":$(printf '%s' "$ext" | jq -Rs '.'),\"package_name\":$(printf '%s' "$pkg_name" | jq -Rs '.'),\"state\":\"installed\"}"
    else
        INSTALLED_JSON+="${sep}{\"name\":$(printf '%s' "$ext" | jq -Rs '.'),\"state\":\"installed\"}"
    fi
    sep=','
done
INSTALLED_JSON+=']'

# Available: curated popular list
AVAILABLE_JSON='['
sep=''
for entry in "${AVAILABLE[@]}"; do
    ext="${entry%%|*}"
    pkg="${entry##*|}"
    AVAILABLE_JSON+="${sep}{\"name\":$(printf '%s' "$ext" | jq -Rs '.'),\"package_name\":$(printf '%s' "$pkg" | jq -Rs '.'),\"state\":\"available\"}"
    sep=','
done
AVAILABLE_JSON+=']'

# ── Output ───────────────────────────────────────────────────────────────────
NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
json_ok "$(jq -n \
    --arg version "${VERSION}" \
    --arg binary "${BINARY}" \
    --argjson installed "${INSTALLED_JSON}" \
    --argjson available "${AVAILABLE_JSON}" \
    --arg fetched_at "${NOW}" \
    '{version: $version, binary: $binary, installed: $installed,
      available: $available, fetched_at: $fetched_at,
      source: "curated+rpm"}')"
