#!/usr/bin/env bash
# onx-php-ext-list — Enumerate installed/available PHP extensions per version.
#
# Input (stdin JSON):
#   version  string   "8.3"
#
# Output (stdout JSON):
#   {
#     "version": "8.3",
#     "binary": "/usr/bin/php83",
#     "installed": ["core","mysqli","pdo_mysql","curl","gd",...],
#     "available": ["redis","memcached","mongodb","ldap","sodium",...],
#     "all_known": [...]   # union (sorted)
#   }
#
# Exit codes: 0=ok 1=invalid-input 2=preflight-fail
#
# Deployed to: /usr/local/onoxsoft/bin/onx-php-ext-list

set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=_lib/common.sh
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}" =~ ^[78]\.[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"

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

INSTALLED_JSON=$(printf '%s\n' "${INSTALLED[@]}" | jq -Rsn '[inputs | select(length > 0)]')

# ── Repo-available extensions (not yet installed) ────────────────────────────
AVAILABLE=()
if command -v dnf >/dev/null 2>&1; then
    # repoquery: php83-php-* paketleri
    mapfile -t REPO_PKGS < <(dnf repoquery --quiet --queryformat '%{name}\n' "php${VERSION_NODOT}-php-*" 2>/dev/null \
        | sed "s/^php${VERSION_NODOT}-php-//" | sort -u || true)
    for pkg in "${REPO_PKGS[@]}"; do
        # Skip non-extension packages
        case "${pkg}" in
            fpm|common|cli|devel|pear|opcache) continue ;;
        esac
        # Already installed?
        FOUND=0
        for ins in "${INSTALLED[@]}"; do
            [[ "${ins}" == "${pkg}" ]] && FOUND=1 && break
        done
        [[ ${FOUND} -eq 0 ]] && AVAILABLE+=("${pkg}")
    done
elif command -v apt >/dev/null 2>&1; then
    mapfile -t REPO_PKGS < <(apt-cache search "^php${VERSION}-" 2>/dev/null \
        | awk '{print $1}' | sed "s/^php${VERSION}-//" | sort -u)
    for pkg in "${REPO_PKGS[@]}"; do
        FOUND=0
        for ins in "${INSTALLED[@]}"; do
            [[ "${ins}" == "${pkg}" ]] && FOUND=1 && break
        done
        [[ ${FOUND} -eq 0 ]] && AVAILABLE+=("${pkg}")
    done
fi

AVAILABLE_JSON=$(printf '%s\n' "${AVAILABLE[@]}" | jq -Rsn '[inputs | select(length > 0)]')

ALL_KNOWN_JSON=$(printf '%s\n' "${INSTALLED[@]}" "${AVAILABLE[@]}" \
    | sort -u | jq -Rsn '[inputs | select(length > 0)]')

jq -n \
    --arg version "${VERSION}" \
    --arg binary "${BINARY}" \
    --argjson installed "${INSTALLED_JSON}" \
    --argjson available "${AVAILABLE_JSON}" \
    --argjson all_known "${ALL_KNOWN_JSON}" \
    '{version: $version, binary: $binary, installed: $installed,
      available: $available, all_known: $all_known}'
