#!/usr/bin/env bash
# =============================================================================
# onx-user-terminate — Permanently remove a hosting account
#
# Purpose:
#   Optionally creates a final tar.gz backup, kills all user processes,
#   removes the Linux user and home directory, purges Apache vhost configs,
#   PHP-FPM sockets, and MariaDB users, then reloads affected services.
#
# Input (stdin JSON):
#   {
#     "username":    "onx_xxxx",   -- required
#     "delete_data": true,         -- default true; false = keep /home/<user> intact
#     "backup_first": true         -- default true; create tar.gz before deletion
#   }
#
# Output (stdout JSON):
#   {"username":..., "removed":true, "backup_path":"<path>"|null}
#
# Exit codes: 0=ok 1=invalid-input 2=preflight-fail 3=exec-fail 4=rolled-back 5=rollback-failed
#
# Sudoers entry needed:
#   apache ALL=(root) NOPASSWD: /usr/local/onoxsoft/bin/onx-user-terminate
#   Defaults!/usr/local/onoxsoft/bin/onx-user-terminate !requiretty
#   Defaults!/usr/local/onoxsoft/bin/onx-user-terminate log_output, log_input
#
# Deployed to: /usr/local/onoxsoft/bin/onx-user-terminate
# =============================================================================

set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=_lib/common.sh
source "${SCRIPT_DIR}/_lib/common.sh"

# ── Constants ─────────────────────────────────────────────────────────────────
TERM_BACKUP_DIR="/var/onox/term-backups"
VHOST_ACTIVE_DIR="/etc/httpd/conf.d/sites"
VHOST_SUSPENDED_DIR="/etc/httpd/suspended"
FPM_SOCK_DIR="/run/php-fpm"

# ── Dependencies ──────────────────────────────────────────────────────────────
command -v jq       >/dev/null 2>&1 || { printf '{"error":"jq required"}\n' >&2; exit 2; }
command -v userdel  >/dev/null 2>&1 || { printf '{"error":"userdel required"}\n' >&2; exit 2; }
command -v tar      >/dev/null 2>&1 || { printf '{"error":"tar required"}\n' >&2; exit 2; }
command -v mysql    >/dev/null 2>&1 || { printf '{"error":"mysql (mariadb) required"}\n' >&2; exit 2; }
require_root

# ── Read & parse stdin ────────────────────────────────────────────────────────
INPUT=$(cat)
onx_require_json "${INPUT}"

USERNAME=$(onx_json_get      "${INPUT}" "username")
DELETE_DATA=$(onx_json_get_bool "${INPUT}" "delete_data"  "true")
BACKUP_FIRST=$(onx_json_get_bool "${INPUT}" "backup_first" "true")

# ── Input validation ──────────────────────────────────────────────────────────
onx_validate_username "${USERNAME}"

# ── Preflight ─────────────────────────────────────────────────────────────────
id "${USERNAME}" &>/dev/null || onx_die 2 "Linux user does not exist: ${USERNAME}"
HOME_DIR="/home/${USERNAME}"

# ── Optional backup ───────────────────────────────────────────────────────────
BACKUP_PATH="null"
if [[ "${BACKUP_FIRST}" == "true" && -d "${HOME_DIR}" ]]; then
    mkdir -p "${TERM_BACKUP_DIR}"
    TS=$(date -u +"%Y%m%d%H%M%S")
    BACKUP_PATH="${TERM_BACKUP_DIR}/${USERNAME}-${TS}.tar.gz"
    tar -czf "${BACKUP_PATH}" -C /home "${USERNAME}" 2>/dev/null || \
        onx_die 3 "backup tar failed for ${USERNAME}"
    onx_log "backup created: ${BACKUP_PATH}"
fi

# ── Kill user processes ───────────────────────────────────────────────────────
# SIGKILL all processes owned by the user; ignore errors (user may have none)
pkill -KILL -u "${USERNAME}" 2>/dev/null || true
onx_log "pkill -KILL -u ${USERNAME} sent"

# ── Remove Linux user (and home if delete_data=true) ─────────────────────────
if [[ "${DELETE_DATA}" == "true" ]]; then
    userdel -r "${USERNAME}" 2>/dev/null || userdel "${USERNAME}" 2>/dev/null || \
        onx_die 3 "userdel failed for ${USERNAME}"
else
    # Keep the home dir; just remove the user entry
    userdel "${USERNAME}" 2>/dev/null || onx_die 3 "userdel failed for ${USERNAME}"
fi
onx_log "userdel OK: ${USERNAME} (delete_data=${DELETE_DATA})"

# ── Remove vhost configs (active + suspended) ─────────────────────────────────
rm -f "${VHOST_ACTIVE_DIR}/${USERNAME}"-*.conf 2>/dev/null  || true
rm -f "${VHOST_SUSPENDED_DIR}/${USERNAME}"-*.conf 2>/dev/null || true
onx_log "vhost configs removed"

# ── Remove PHP-FPM socket ─────────────────────────────────────────────────────
rm -f "${FPM_SOCK_DIR}/${USERNAME}"-*.sock 2>/dev/null || true
onx_log "php-fpm sockets removed"

# ── Drop MariaDB users (onx_xxx_*) ───────────────────────────────────────────
# Enumerate users matching the pattern and drop each one
DB_PREFIX="${USERNAME}_"
# Build a semicolon-separated DROP USER list; tolerate empty result
DB_USERS=$(mysql -N -e \
    "SELECT CONCAT('\"', User, '\"@\"', Host, '\"') FROM mysql.user WHERE User LIKE '${DB_PREFIX}%';" \
    2>/dev/null || true)

if [[ -n "${DB_USERS}" ]]; then
    while IFS= read -r db_user; do
        [[ -z "${db_user}" ]] && continue
        mysql -e "DROP USER IF EXISTS ${db_user}; FLUSH PRIVILEGES;" 2>/dev/null || \
            onx_log "WARNING: could not drop DB user ${db_user}"
        onx_log "MariaDB user dropped: ${db_user}"
    done <<< "${DB_USERS}"
fi

# ── Reload services ───────────────────────────────────────────────────────────
systemctl reload httpd   2>/dev/null || onx_log "WARNING: httpd reload failed"
systemctl reload php-fpm 2>/dev/null || onx_log "WARNING: php-fpm reload failed"
onx_log "services reloaded after termination of ${USERNAME}"

# ── Output ────────────────────────────────────────────────────────────────────
printf '{"username":"%s","removed":true,"backup_path":%s}\n' \
    "${USERNAME}" \
    "$( [[ "${BACKUP_PATH}" == "null" ]] && echo "null" || printf '"%s"' "${BACKUP_PATH}")"
