#!/usr/bin/env bash
# onx-php-install — Install a PHP version via the appropriate distro repo.
#
# EasyApache 4 muadili. AlmaLinux 9'da Remi Modular PHP, Debian/Ubuntu'da Sury PPA.
#
# Input (stdin JSON):
#   version     string   PHP majör.minör (örn "8.3", "8.4", "8.5")
#   source      string   "remi" (RHEL) | "sury" (Debian) | "source" (compile)
#   extensions  array?   ["gd","mysqli",...] varsayılan defaults paketi
#
# Output (stdout JSON):
#   {"installed":true, "version":"8.3", "source":"remi", "runtime":"PHP 8.3.13 (cli)",
#    "fpm_unit":"php83-php-fpm", "binary":"/usr/bin/php83", "extensions_installed":[...]}
#
# Exit codes: 0=ok 1=invalid-input 2=preflight-fail 3=exec-fail 4=rolled-back
#
# Deployed to: /usr/local/onoxsoft/bin/onx-php-install

set -euo pipefail

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

# ── Default extension package ────────────────────────────────────────────────
# Mass hosting'in olmazsa olmazları — cPanel EasyApache default profili.
DEFAULT_EXTENSIONS=(
    php-fpm
    php-mysqlnd
    php-opcache
    php-gd
    php-intl
    php-mbstring
    php-xml
    php-zip
    php-curl
    php-bcmath
    php-soap
    php-imagick
    php-process
    php-sodium
)

# ── Read & parse stdin ───────────────────────────────────────────────────────
INPUT=$(cat)
onx_require_json "${INPUT}"

VERSION=$(onx_json_get "${INPUT}" "version")
SOURCE=$(onx_json_get "${INPUT}" "source" "remi")

# ── Input validation ─────────────────────────────────────────────────────────
[[ -z "${VERSION}" ]] && onx_die 1 "version is required (e.g., 8.3)"
[[ "${VERSION}" =~ ^[78]\.[0-9]$ ]] || onx_die 1 "version must be x.y (7.x or 8.x), got: ${VERSION}"
case "${SOURCE}" in
    remi|sury|source) ;;
    *) onx_die 1 "source must be one of: remi, sury, source — got: ${SOURCE}" ;;
esac

# php_version "8.3" → "83"
VERSION_NODOT="${VERSION//./}"

# ── Preflight ────────────────────────────────────────────────────────────────
[[ $EUID -eq 0 ]] || onx_die 2 "must be run as root"

# Already installed?
if command -v "php${VERSION_NODOT}" >/dev/null 2>&1; then
    EXISTING=$("php${VERSION_NODOT}" -v 2>/dev/null | head -1 || echo "")
    onx_log "PHP ${VERSION} already installed: ${EXISTING}"
    onx_json_out \
        "installed"    "true" \
        "version"      "${VERSION}" \
        "source"       "${SOURCE}" \
        "runtime"      "${EXISTING}" \
        "fpm_unit"     "php${VERSION_NODOT}-php-fpm" \
        "binary"       "/usr/bin/php${VERSION_NODOT}" \
        "already_present" "true"
    exit 0
fi

# ── Install ──────────────────────────────────────────────────────────────────
INSTALLED_EXTS=()

if [[ "${SOURCE}" == "remi" ]]; then
    command -v dnf >/dev/null 2>&1 || onx_die 2 "dnf not found — Remi installation requires AlmaLinux/RHEL/CentOS"

    # 1. Remi repo
    if ! rpm -q remi-release >/dev/null 2>&1; then
        onx_log "Installing remi-release repository"
        dnf install -y "https://rpms.remirepo.net/enterprise/remi-release-9.rpm" \
            || onx_die 3 "failed to install remi-release"
    fi

    # 2. Module reset + enable target version
    onx_log "Resetting PHP modules"
    dnf module reset php -y >/dev/null 2>&1 || true
    dnf module install -y "php:remi-${VERSION}" >/dev/null 2>&1 \
        || onx_die 3 "failed to install php:remi-${VERSION} module"

    # 3. Build package list (php83-php-fpm format)
    PKGS=()
    for ext in "${DEFAULT_EXTENSIONS[@]}"; do
        # php-fpm → php83-php-fpm
        PKGS+=("php${VERSION_NODOT}-${ext}")
    done
    PKGS+=("php${VERSION_NODOT}")  # ensure CLI

    onx_log "Installing packages: ${PKGS[*]}"
    if ! dnf install -y "${PKGS[@]}"; then
        onx_die 3 "package installation failed"
    fi

    FPM_UNIT="php${VERSION_NODOT}-php-fpm"
    BINARY="/usr/bin/php${VERSION_NODOT}"

elif [[ "${SOURCE}" == "sury" ]]; then
    command -v apt >/dev/null 2>&1 || onx_die 2 "apt not found — Sury installation requires Debian/Ubuntu"

    # Sury PPA setup
    if ! apt-cache policy | grep -q sury; then
        onx_log "Adding Sury PPA"
        apt install -y lsb-release ca-certificates curl >/dev/null 2>&1
        curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /etc/apt/keyrings/sury.gpg \
            || onx_die 3 "failed to fetch Sury GPG key"
        echo "deb [signed-by=/etc/apt/keyrings/sury.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" \
            > /etc/apt/sources.list.d/sury-php.list
        apt update >/dev/null 2>&1
    fi

    PKGS=("php${VERSION}" "php${VERSION}-fpm" "php${VERSION}-mysql" "php${VERSION}-opcache"
          "php${VERSION}-gd" "php${VERSION}-intl" "php${VERSION}-mbstring" "php${VERSION}-xml"
          "php${VERSION}-zip" "php${VERSION}-curl" "php${VERSION}-bcmath" "php${VERSION}-imagick")

    onx_log "Installing Sury packages"
    if ! apt install -y "${PKGS[@]}"; then
        onx_die 3 "apt install failed"
    fi

    FPM_UNIT="php${VERSION}-fpm"
    BINARY="/usr/bin/php${VERSION}"

else
    onx_die 2 "source=source (compile from source) not yet implemented"
fi

# ── Enable + start FPM ───────────────────────────────────────────────────────
onx_log "Enabling ${FPM_UNIT}"
systemctl enable --now "${FPM_UNIT}" 2>/dev/null \
    || onx_log "WARN: failed to enable ${FPM_UNIT} — service may not exist yet"

# ── Verify ───────────────────────────────────────────────────────────────────
RUNTIME=""
if [[ -x "${BINARY}" ]]; then
    RUNTIME=$("${BINARY}" -v 2>/dev/null | head -1 || echo "unknown")
fi
[[ -z "${RUNTIME}" ]] && onx_die 3 "PHP binary not executable after install: ${BINARY}"

# Detect installed extensions
mapfile -t INSTALLED_EXTS < <("${BINARY}" -m 2>/dev/null | grep -v '^\[' | sort -u | head -100)

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

# ── Success ──────────────────────────────────────────────────────────────────
JSON=$(jq -n \
    --arg version "${VERSION}" \
    --arg source "${SOURCE}" \
    --arg runtime "${RUNTIME}" \
    --arg fpm_unit "${FPM_UNIT}" \
    --arg binary "${BINARY}" \
    --argjson extensions "${EXT_JSON}" \
    '{installed: true, version: $version, source: $source, runtime: $runtime,
      fpm_unit: $fpm_unit, binary: $binary, extensions_installed: $extensions}')

printf '%s\n' "${JSON}"
onx_log "PHP ${VERSION} installed via ${SOURCE} — ${RUNTIME}"
