#!/usr/bin/env bash
# site/php -- move one site to another installed PHP version
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 site_m_php)"

if [ "$(nv_site_count)" -eq 0 ]; then ui_info "$(t site_none)"; exit 0; fi

if [ $# -ge 1 ]; then domain=$1; else
    ui_info "$(nv_site_list | paste -sd' ' -)"
    printf '  %s: ' "$(t site_prompt_domain)"
    read -r domain || exit 130
fi
domain=$(nv_lower "$(nv_trim "$domain")")
nv_site_exists "$domain" || { ui_err "$(t site_not_registered)"; exit 2; }

cur=$(nv_site_get "$domain" php_version "$NV_SITE_PHP_VERSION")
mapfile -t avail < <(php_version_list)
if [ ${#avail[@]} -eq 0 ]; then ui_err "$(t site_php_none_installed)"; exit 1; fi

ui_kv "$(t col_php)" "$cur"
ui_info "$(t site_php_available "${avail[*]}")"
printf '  %s: ' "$(t site_php_target)"
read -r target || exit 130
target=$(nv_trim "$target")

found=0
for v in "${avail[@]}"; do [ "$v" = "$target" ] && found=1; done
if [ "$found" != "1" ]; then ui_err "$(t site_php_not_installed "$target")"; exit 2; fi
if [ "$target" = "$cur" ]; then ui_info "$(t site_php_same)"; exit 0; fi

nv_lock_acquire "site:$domain" 10 || { nv_fail 6199 "$(t lock_busy "$domain")"; exit 1; }

ui_step "$(t site_php_switch "$cur" "$target")"
old_pool=$(site_pool_path "$domain" "$cur")
new_pool=$(site_pool_path "$domain" "$target")

site_write_pool "$domain" "$target"
php-fpm"$target" -t >/dev/null 2>&1 || {
    rm -f "$new_pool"
    nv_fail 2301 "$(t site_php_test_failed "$target")"
    exit 1
}
[ -f "$old_pool" ] && [ "$old_pool" != "$new_pool" ] && rm -f "$old_pool"

nv_site_set "$domain" php_version "$target"
site_reload "$target"
site_reload "$cur"
nv_trace site-php "$domain $cur -> $target"
nv_lock_release "site:$domain"

ui_ok "$(t site_php_done "$domain" "$target")"
exit 0
