#!/usr/bin/env bash
# php/extensions -- list, enable and disable extensions for one version
#
# Uses the distribution tools (phpenmod/phpdismod) so the change is recorded the
# same way as a hand edit would be, and reloads FPM afterwards.
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
ui_header "$(t php_m_extensions)"

mapfile -t versions < <(php_version_list)
if [ ${#versions[@]} -eq 0 ]; then ui_warn "$(t php_none_installed)"; exit 0; fi

v=${1:-}
if [ -z "$v" ]; then
    ui_info "$(t php_available "${versions[*]}")"
    printf '  %s [%s]: ' "$(t php_col_version)" "$(php_default_version)"
    read -r v || exit 130
fi
v=$(nv_trim "$v")
[ -z "$v" ] && v=$(php_default_version)

found=0
for x in "${versions[@]}"; do [ "$x" = "$v" ] && found=1; done
[ "$found" = "1" ] || { ui_err "$(t site_php_not_installed "$v")"; exit 2; }

if ! nv_have phpenmod; then
    ui_err "$(t php_no_phpenmod)"
    exit 1
fi

ui_section "$(t php_loaded "$v")"
php"$v" -m 2>/dev/null | tail -n +2 | sort | paste -sd' ' - | fold -s -w 74 | sed 's/^/  /'

ui_section "$(t php_available_mods "$v")"
avail=""
for f in /etc/php/"$v"/mods-available/*.ini; do
    [ -f "$f" ] || continue
    avail="$avail $(basename "$f" .ini)"
done
printf '%s\n' "$avail" | tr ' ' '\n' | grep -v '^$' | sort | paste -sd' ' - | fold -s -w 74 | sed 's/^/  /'
ui_blank

printf '  %s (%s / %s): ' "$(t php_prompt_ext)" "$(t php_on)" "$(t php_off)"
read -r answer || exit 130
answer=$(nv_trim "$answer")
action=${answer%% *}
mod=${answer#* }
[ -z "$action" ] && exit 0

case $action in
    on|off) ;;
    *) ui_err "$(t php_ext_usage)"; exit 2 ;;
esac
[ -z "$mod" ] || [ "$mod" = "$answer" ] && { ui_err "$(t php_ext_usage)"; exit 2; }
nv_valid_ident "$mod" || { ui_err "$(t php_ext_bad_name)"; exit 2; }

if [ "$action" = "on" ]; then
    phpenmod -v "$v" -s ALL "$mod" 2>/dev/null || { nv_fail 2305 "$(t php_ext_failed "$mod")"; exit 1; }
else
    phpdismod -v "$v" -s ALL "$mod" 2>/dev/null || { nv_fail 2305 "$(t php_ext_failed "$mod")"; exit 1; }
fi

if php-fpm"$v" -t >/dev/null 2>&1; then
    svc_reload "php$v-fpm"
    nv_trace php-ext "$v $mod $action"
    ui_ok "$(t php_ext_done "$mod" "$action" "$v")"
else
    ui_err "$(t php_ext_test_failed)"
    if [ "$action" = "on" ]; then phpdismod -v "$v" -s ALL "$mod" >/dev/null 2>&1 || true
    else phpenmod -v "$v" -s ALL "$mod" >/dev/null 2>&1 || true; fi
    exit 1
fi
exit 0
