#!/usr/bin/env bash
# onx-fpm-pool-status — FPM pool canlı status (pm.status_path benzeri)
#
# Pool dosyasından pm.status_path okur (yoksa /onx-fpm-status default ekler),
# socket üzerinden cURL ile status JSON çeker.
#
# Input (stdin JSON):
#   { "pool_name": "onx_acme01", "php_version": "8.2" }
#
# Output:
#   {
#     "pool":"onx_acme01", "php_version":"8.2",
#     "pm":"ondemand", "process_manager":"ondemand",
#     "start_time":"...", "start_since":N,
#     "accepted_conn":N, "listen_queue":N, "max_listen_queue":N,
#     "idle_processes":N, "active_processes":N, "total_processes":N,
#     "max_active_processes":N, "max_children_reached":N, "slow_requests":N,
#     "socket_path":"/var/opt/.../sock"
#   }

set -euo pipefail

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

require_root
onx_json_input

POOL_NAME="$(onx_json_field pool_name)"
PHP_VERSION="$(onx_json_field php_version)"

[[ -z "$POOL_NAME" ]]   && onx_die 1 "pool_name zorunlu"
[[ -z "$PHP_VERSION" ]] && onx_die 1 "php_version zorunlu"
[[ "$POOL_NAME"   =~ ^[a-z0-9_-]+$ ]] || onx_die 1 "Gecersiz pool_name"
[[ "$PHP_VERSION" =~ ^[7-9]\.[0-9]+$ ]] || onx_die 1 "Gecersiz php_version"

VERSION_NODOT="${PHP_VERSION//./}"
POOL_DIR="/etc/opt/remi/php${VERSION_NODOT}/php-fpm.d"
POOL_FILE="${POOL_DIR}/${POOL_NAME}.conf"

[[ -f "$POOL_FILE" ]] || onx_die 2 "Pool dosyasi yok: $POOL_FILE"

# Pool config'ten socket path + status path oku
SOCKET=$(grep -E '^[[:space:]]*listen[[:space:]]*=' "$POOL_FILE" | head -1 | awk -F= '{print $2}' | tr -d ' ')
STATUS_PATH=$(grep -E '^[[:space:]]*pm\.status_path[[:space:]]*=' "$POOL_FILE" | head -1 | awk -F= '{print $2}' | tr -d ' ')

# Status path yoksa otomatik ekle
if [[ -z "${STATUS_PATH}" ]]; then
    STATUS_PATH="/onx-fpm-status"
    echo "pm.status_path = ${STATUS_PATH}" >> "$POOL_FILE"
    FPM_UNIT="php${VERSION_NODOT}-php-fpm"
    systemctl reload "${FPM_UNIT}" 2>/dev/null || systemctl restart "${FPM_UNIT}" 2>/dev/null || true
fi

# cgi-fcgi ile socket'a status çağrısı (cgi-fcgi yoksa fail tolerant)
if ! command -v cgi-fcgi >/dev/null 2>&1; then
    # Fallback: curl via socat (yoksa)
    json_ok "{\"pool\":\"${POOL_NAME}\",\"php_version\":\"${PHP_VERSION}\",\"socket_path\":\"${SOCKET}\",\"status_path\":\"${STATUS_PATH}\",\"error\":\"cgi-fcgi yok — dnf install fcgi gerek\"}"
    exit 0
fi

# cgi-fcgi: SCRIPT_NAME + QUERY_STRING set ile pool'a request
RAW=$(SCRIPT_NAME="${STATUS_PATH}" \
      SCRIPT_FILENAME="${STATUS_PATH}" \
      QUERY_STRING="json" \
      REQUEST_METHOD=GET \
      cgi-fcgi -bind -connect "${SOCKET}" 2>/dev/null || echo "")

# Parse Status raw output (PHP-FPM returns JSON when ?json query)
# RAW formati: HTTP headers + body. Boş satırdan sonrası JSON.
BODY=$(echo "$RAW" | awk 'BEGIN{body=0} /^\r?$/{body=1; next} body{print}')

if [[ -z "${BODY}" ]] || ! echo "$BODY" | jq -e . >/dev/null 2>&1; then
    json_ok "{\"pool\":\"${POOL_NAME}\",\"php_version\":\"${PHP_VERSION}\",\"socket_path\":\"${SOCKET}\",\"status_path\":\"${STATUS_PATH}\",\"error\":\"Status fetch fail — pool calismiyor olabilir\"}"
    exit 0
fi

# Add pool/version metadata
RESULT=$(echo "$BODY" | jq --arg pool "$POOL_NAME" --arg version "$PHP_VERSION" --arg socket "$SOCKET" \
    '. + {pool:$pool, php_version:$version, socket_path:$socket}')

json_ok "$RESULT"
