#!/usr/bin/env bash
# database/drop -- remove a database and its user, after a safety dump
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 db_m_drop)"
db_available || { ui_err "$(t db_unreachable)"; exit 1; }

printf '  %s: ' "$(t db_prompt_name)"
read -r name || exit 130
name=$(nv_trim "$name")
nv_valid_dbname "$name" || { ui_err "$(t db_bad_name)"; exit 2; }

db_root_exec "SHOW DATABASES LIKE '$name'" 2>/dev/null | grep -q . \
    || { ui_err "$(t db_not_found "$name")"; exit 2; }

for domain in $(nv_site_list); do
    if [ "$(nv_site_get "$domain" db_name "")" = "$name" ]; then
        ui_err "$(t db_drop_in_use "$name" "$domain")"
        exit 2
    fi
done

ui_blank
ui_warn "$(t db_drop_warn "$name")"
ui_confirm_typed "$(t db_drop_confirm)" "$name" || { ui_info "$(t pf_cancelled)"; exit 3; }

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

safety="$NV_BACKUP_ROOT/$(date -u '+%Y%m%dT%H%M%SZ').pre-drop"
install -d -m 0700 "$safety"
ui_step "$(t backup_dump_current)"
pass=$(nv_secret db_root_password)
if [ -n "$pass" ]; then
    mysqldump --protocol=socket -u root -p"$pass" --single-transaction "$name" 2>/dev/null \
        | gzip -9 >"$safety/$name.sql.gz"
else
    mysqldump --protocol=socket -u root --single-transaction "$name" 2>/dev/null \
        | gzip -9 >"$safety/$name.sql.gz"
fi
[ -s "$safety/$name.sql.gz" ] || { nv_fail 4404 "$(t db_drop_dump_failed)"; exit 1; }
ui_ok "$(t backup_safety_at "$safety")"

db_root_exec "DROP DATABASE IF EXISTS \`$name\`" || { nv_fail 3108 "$(t db_drop_failed)"; exit 1; }
if ui_confirm "$(t db_drop_user_q)" y; then
    db_root_exec "DROP USER IF EXISTS '$name'@'localhost'" >/dev/null 2>&1 || true
fi
nv_trace db-drop "$name"
nv_lock_release "db:$name"

ui_ok "$(t db_dropped "$name")"
exit 0
