#!/usr/bin/env bash
# site/media -- see and remove the things WordPress accumulates silently
#
# Post revisions and expired transients are the usual reason a small site has a
# 400 MB database.
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_media)"

site_pick_domain "${1:-}" || exit $?
domain=$SITE_DOMAIN
root=$(nv_site_get "$domain" root_path "$(site_domain_root "$domain")")
user=$(site_web_user "$domain")
[ -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; }
WP="sudo -u $user /usr/local/bin/wp --path=$root"

ui_section "$(t media_counts)"
ui_kv "$(t media_uploads)"   "$(du -sh "$root/wp-content/uploads" 2>/dev/null | cut -f1)"
ui_kv "$(t media_revisions)" "$($WP post list --post_type=revision --format=count 2>/dev/null)"
ui_kv "$(t media_transients)" "$($WP transient list --format=count 2>/dev/null)"
ui_kv "$(t media_plugins)"   "$($WP plugin list --format=count 2>/dev/null)"
ui_blank
ui_info "1) $(t media_clean_revisions)"
ui_info "2) $(t media_clean_transients)"
ui_info "3) $(t media_clean_both)"
ui_info "0) $(t menu_back)"
ui_blank
printf '  %s: ' "$(t menu_prompt_short)"
read -r pick || exit 130
case $pick in 0) exit 0 ;; 1|2|3) ;; *) ui_err "$(t menu_invalid)"; exit 2 ;; esac

ui_warn "$(t media_warn)"
ui_confirm "$(t media_confirm)" n || exit 0

snap=$(site_snapshot "$domain" "pre-clean-$domain")
ui_ok "$(t backup_safety_at "$snap")"

case $pick in
    1|3)
        ui_step "$(t media_clean_revisions)"
        ids=$($WP post list --post_type=revision --format=ids 2>/dev/null)
        if [ -n "$ids" ]; then
            # shellcheck disable=SC2086
            $WP post delete $ids --force >/dev/null 2>&1 || true
        fi
        ui_ok "$(t media_revisions_done)"
        ;;
esac
case $pick in
    2|3)
        ui_step "$(t media_clean_transients)"
        $WP transient delete --expired >/dev/null 2>&1 || true
        $WP transient delete --all >/dev/null 2>&1 || true
        ui_ok "$(t media_transients_done)"
        ;;
esac

$WP cache flush >/dev/null 2>&1 || true
nv_trace media-clean "$domain option=$pick"
ui_ok "$(t media_done)"
exit 0
