#!/usr/bin/env bash
# site/redis -- Redis object cache for one WordPress site
#
# The drop-in is provided by the redis-cache plugin, which is installed through
# wp-cli. Each site gets its own logical database so one site cannot flush
# another's cache.
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_redis)"

site_pick_domain "${1:-}" || exit $?
domain=$SITE_DOMAIN
root=$(nv_site_get "$domain" root_path "$(site_domain_root "$domain")")
user=$(site_web_user "$domain")
cur=$(nv_site_get "$domain" cache_redis 0)

[ -f "$root/wp-config.php" ] || { ui_err "$(t wp_update_not_wp)"; exit 2; }
[ -x /usr/local/bin/wp ] || { ui_err "$(t site_wp_nocli)"; exit 1; }
redis-cli ping >/dev/null 2>&1 || { ui_err "$(t redis_down)"; ui_info "$(t redis_hint_start)"; exit 1; }

WP="sudo -u $user /usr/local/bin/wp --path=$root"

ui_kv "$(t col_domain)" "$domain"
ui_kv "$(t web_state)"  "$([ "$cur" = "1" ] && t state_enabled || t state_disabled)"
ui_blank

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

if [ "$cur" = "1" ]; then
    ui_confirm "$(t web_disable_q)" n || { nv_lock_release "site:$domain"; exit 0; }
    ui_step "$(t redis_disable_running)"
    $WP redis disable >/dev/null 2>&1 || true
    $WP plugin deactivate redis-cache >/dev/null 2>&1 || true
    nv_site_set "$domain" cache_redis 0
    nv_trace site-redis "$domain off"
    nv_lock_release "site:$domain"
    ui_ok "$(t redis_site_off)"
    exit 0
fi

ui_confirm "$(t web_enable_q)" n || { nv_lock_release "site:$domain"; exit 0; }

# stable logical database per site, 1..15
dbno=$(( 1 + $(printf '%s' "$domain" | cksum | cut -d' ' -f1) % 15 ))
ui_step "$(t redis_configure "$dbno")"
$WP config set WP_REDIS_HOST 127.0.0.1 --quiet 2>/dev/null || true
$WP config set WP_REDIS_PORT 6379 --raw --quiet 2>/dev/null || true
$WP config set WP_REDIS_DATABASE "$dbno" --raw --quiet 2>/dev/null || true

ui_step "$(t redis_install_plugin)"
if ! $WP plugin install redis-cache --activate >/tmp/nhanhvps-redis.log 2>&1; then
    ui_err "$(t redis_plugin_failed)"
    tail -n 8 /tmp/nhanhvps-redis.log | sed 's/^/    /'
    nv_log error 3110 "redis-cache install failed for $domain"
    nv_lock_release "site:$domain"
    exit 1
fi

ui_step "$(t redis_enable_dropin)"
if ! $WP redis enable >>/tmp/nhanhvps-redis.log 2>&1; then
    ui_err "$(t redis_dropin_failed)"
    tail -n 8 /tmp/nhanhvps-redis.log | sed 's/^/    /'
    nv_lock_release "site:$domain"
    exit 1
fi

nv_site_set "$domain" cache_redis 1
nv_site_set "$domain" redis_db "$dbno"
nv_trace site-redis "$domain on db=$dbno"
nv_lock_release "site:$domain"

ui_ok "$(t redis_site_on "$domain")"
ui_kv "$(t redis_logical_db)" "$dbno"
exit 0
