#!/usr/bin/env bash
# web/php-ini -- inspect and change the safe subset of php.ini
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1

INI=$(php_ini_path)
[ -r "$INI" ] || { nv_fail 2302 "php.ini not found: $INI"; exit 1; }

current() { sed -n "s/^[[:space:]]*$1[[:space:]]*=[[:space:]]*//p" "$INI" | head -n 1; }

ui_header "$(t mod_web_phpini)" "$INI"
keys=(memory_limit upload_max_filesize post_max_size max_execution_time max_input_vars)
i=0
for k in "${keys[@]}"; do
    i=$((i + 1))
    ui_kv "$i) $k" "$(current "$k")"
done
ui_kv "0)" "$(t menu_back)"
ui_blank

printf '  %s: ' "$(t phpini_prompt)"
read -r pick || exit 130
case $pick in ''|*[!0-9]*) ui_err "$(t ui_invalid_number)"; exit 2 ;; esac
[ "$pick" -eq 0 ] && exit 0
[ "$pick" -lt 1 ] || [ "$pick" -gt ${#keys[@]} ] && { ui_err "$(t menu_invalid)"; exit 2; }

key=${keys[$((pick - 1))]}
printf '  %s (%s): ' "$(t phpini_new_value "$key")" "$(current "$key")"
read -r val || exit 130
val=$(nv_trim "$val")

case $key in
    memory_limit|upload_max_filesize|post_max_size)
        nv_valid_size "$val" || { ui_err "$(t phpini_bad_size)"; exit 2; } ;;
    max_execution_time|max_input_vars)
        case $val in ''|*[!0-9]*) ui_err "$(t ui_invalid_number)"; exit 2 ;; esac ;;
esac

nv_backup_path "$INI" php-ini >/dev/null 2>&1 || true
if grep -qE "^[[:space:]]*${key}[[:space:]]*=" "$INI"; then
    sed -i -E "s|^[[:space:]]*${key}[[:space:]]*=.*|$key = $val|" "$INI"
else
    printf '\n%s = %s\n' "$key" "$val" >>"$INI"
fi

v=$(php_fpm_service)
if php-fpm8.3 -t >/dev/null 2>&1; then
    svc_reload "$v"
    nv_trace php-ini "$key=$val"
    ui_ok "$(t phpini_saved "$key" "$val")"
else
    ui_err "$(t phpini_test_failed)"
    nv_backup_restore "$INI" && ui_ok "$(t phpini_restored)"
    exit 1
fi
exit 0
