#!/usr/bin/env bash
# onx-wp-cli — WordPress WP-CLI komutlarını belirtilen kullanıcı olarak çalıştırır.
#
# Input (stdin JSON):
#   {
#     "username":         "onx_abc123",          // Linux kullanıcı adı
#     "wp_path":          "/home/onx_abc123/public_html",  // WP kök dizini
#     "command":          "plugin list",         // WP-CLI sub-command
#     "args":             ["--format=json"]      // isteğe bağlı ek argümanlar
#   }
#
# Output (stdout JSON):
#   {"success":true, "output":"...", "parsed":[...], "duration_ms":N}
#   {"success":false, "error":"...", "duration_ms":N}
#
# Exit codes: 0=ok  1=invalid-input  2=preflight-fail  3=exec-fail
#
# Deployed to: /usr/local/onoxsoft/bin/onx-wp-cli

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=_lib/common.sh
source "${SCRIPT_DIR}/_lib/common.sh"

# ─── Env / config ─────────────────────────────────────────────────────────────
WP_CLI_BIN="${WP_CLI_BIN:-/usr/local/bin/wp}"
WP_CLI_ENV_FILE="/etc/onoxsoft/wp-cli-environment"

require_root
require_cmd "$WP_CLI_BIN"

# Source opsiyonel ortam dosyası (WP-CLI önbellekleme, allow-root vs.)
# shellcheck disable=SC1090
[[ -f "$WP_CLI_ENV_FILE" ]] && source "$WP_CLI_ENV_FILE"

# ─── Input ────────────────────────────────────────────────────────────────────
onx_json_input

USERNAME="$(onx_json_field username)"
WP_PATH="$(onx_json_field wp_path)"
COMMAND="$(onx_json_field command)"

[[ -z "$USERNAME" ]]  && onx_die 1 "username zorunlu"
[[ -z "$WP_PATH"  ]]  && onx_die 1 "wp_path zorunlu"
[[ -z "$COMMAND"  ]]  && onx_die 1 "command zorunlu"

# Güvenlik: username pattern
onx_validate_username "$USERNAME"

# Güvenlik: wp_path mutlak ve /home/<username> altında olmalı
[[ "$WP_PATH" =~ ^/home/[a-zA-Z0-9_]+ ]] || onx_die 1 "wp_path geçersiz: '${WP_PATH}' — /home/<user>/... bekleniyor"

# Güvenlik: command whitelist (en tehlikeli WP-CLI sub-commands engellenir)
DANGEROUS_CMDS="eval|shell|server|scaffold"
if echo "$COMMAND" | grep -qE "^(${DANGEROUS_CMDS})"; then
    onx_die 1 "Tehlikeli WP-CLI komutu reddedildi: '${COMMAND}'"
fi

# WP dizini varlık kontrolü
[[ -d "$WP_PATH" ]] || onx_die 2 "wp_path mevcut değil: '${WP_PATH}'"
[[ -f "${WP_PATH}/wp-config.php" ]] || onx_die 2 "wp-config.php bulunamadı: '${WP_PATH}'"

# ─── Args JSON → bash array ───────────────────────────────────────────────────
# Input'tan args dizisini çek. Her eleman ayrı bir bash array üyesi olur.
declare -a WP_ARGS=()
while IFS= read -r arg; do
    [[ -n "$arg" ]] && WP_ARGS+=("$arg")
done < <(echo "$INPUT" | jq -r '.args // [] | .[]')

onx_log "wp-cli: user=${USERNAME} path=${WP_PATH} cmd=${COMMAND} args=${WP_ARGS[*]:-}"

# ─── Execute ──────────────────────────────────────────────────────────────────
START_NS=$(date +%s%N)

# sudo ile hedef kullanıcı olarak çalıştır; --allow-root olmadan
# WP-CLI kendi içinde owner kontrolü yapar.
WP_OUTPUT=$(sudo -u "$USERNAME" \
    "$WP_CLI_BIN" \
    --path="$WP_PATH" \
    --no-color \
    $COMMAND \
    "${WP_ARGS[@]+"${WP_ARGS[@]}"}" \
    2>&1) \
    || WP_EXIT_CODE=$?

END_NS=$(date +%s%N)
DURATION_MS=$(( (END_NS - START_NS) / 1000000 ))

WP_EXIT_CODE="${WP_EXIT_CODE:-0}"

onx_log "wp-cli done: exit=${WP_EXIT_CODE} duration_ms=${DURATION_MS}"

if [[ "$WP_EXIT_CODE" -ne 0 ]]; then
    # Çıktıyı escape ederek JSON'a göm
    ESCAPED_OUT=$(printf '%s' "$WP_OUTPUT" | jq -Rs '.')
    printf '{"success":false,"error":%s,"duration_ms":%d}\n' "$ESCAPED_OUT" "$DURATION_MS"
    exit 3
fi

# JSON parse dene (--format=json kullanıldıysa)
PARSED="null"
if echo "$WP_OUTPUT" | jq -e 'type == "array" or type == "object"' >/dev/null 2>&1; then
    PARSED=$(echo "$WP_OUTPUT" | jq '.')
fi

ESCAPED_OUT=$(printf '%s' "$WP_OUTPUT" | jq -Rs '.')
printf '{"success":true,"output":%s,"parsed":%s,"duration_ms":%d}\n' \
    "$ESCAPED_OUT" "$PARSED" "$DURATION_MS"
