#!/usr/bin/env bash
# onx-vhost-remove — Remove a vhost config file (driver-aware).
#
# Input (stdin JSON):
#   server    string  apache | nginx | caddy | openlitespeed (default: apache)
#   username  string  Linux username (onx_xxx)
#   domain    string  Domain name
#
# Output (stdout JSON):
#   {"removed":true, "vhost_path":..., "server":...}
#
# Exit codes: 0=ok 1=invalid-input 2=preflight-fail 3=exec-fail 4=rolled-back
#
# Deployed to: /usr/local/onoxsoft/bin/onx-vhost-remove

set -euo pipefail

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

# ── Read & parse stdin ───────────────────────────────────────────────────────
INPUT=$(cat)

onx_require_json "${INPUT}"

SERVER=$(onx_json_get "${INPUT}" "server" "apache")
USERNAME=$(onx_json_get "${INPUT}" "username")
DOMAIN=$(onx_json_get "${INPUT}" "domain")

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

# ── Driver-specific vhost dir + reload command ───────────────────────────────
case "${SERVER}" in
  apache)
    VHOST_DIR="/etc/httpd/conf.d/sites"
    VHOST_EXT="conf"
    RELOAD_CMD="systemctl reload httpd"
    CONFTEST_CMD="apachectl configtest"
    ;;
  nginx)
    VHOST_DIR="/etc/nginx/conf.d/sites"
    VHOST_EXT="conf"
    RELOAD_CMD="systemctl reload nginx"
    CONFTEST_CMD="nginx -t"
    ;;
  caddy)
    VHOST_DIR="/etc/caddy/sites"
    VHOST_EXT="caddy"
    RELOAD_CMD="systemctl reload caddy"
    CONFTEST_CMD="caddy validate --config /etc/caddy/Caddyfile"
    ;;
  openlitespeed|litespeed)
    # OLS: per-vhost klasör altında vhconf.conf
    VHOST_DIR="/usr/local/lsws/conf/vhosts"
    VHOST_EXT=""  # custom — full dir removed
    RELOAD_CMD="/usr/local/lsws/bin/lswsctrl restart"
    CONFTEST_CMD=""
    ;;
  *)
    onx_die 1 "unknown server: ${SERVER}"
    ;;
esac

# ── Preflight ────────────────────────────────────────────────────────────────
if [[ "${SERVER}" == "openlitespeed" || "${SERVER}" == "litespeed" ]]; then
  VHOST_PATH="${VHOST_DIR}/${USERNAME}-${DOMAIN}"
else
  VHOST_PATH="${VHOST_DIR}/${USERNAME}-${DOMAIN}.${VHOST_EXT}"
fi

EXISTS=true
if [[ "${SERVER}" == "openlitespeed" || "${SERVER}" == "litespeed" ]]; then
  [[ -d "${VHOST_PATH}" ]] || EXISTS=false
else
  [[ -f "${VHOST_PATH}" ]] || EXISTS=false
fi

if [[ "${EXISTS}" == "false" ]]; then
  # Idempotent: already gone is OK
  onx_log "vhost not found (already removed?): ${VHOST_PATH}"
  onx_json_out "removed" "true" "vhost_path" "${VHOST_PATH}" "server" "${SERVER}" "note" "already_absent"
  exit 0
fi

# ── Back up before delete ────────────────────────────────────────────────────
BACKUP_PATH="${VHOST_PATH}.bak.$$"
if [[ "${SERVER}" == "openlitespeed" || "${SERVER}" == "litespeed" ]]; then
  cp -r "${VHOST_PATH}" "${BACKUP_PATH}"
  rm -rf "${VHOST_PATH}"
else
  cp "${VHOST_PATH}" "${BACKUP_PATH}"
  rm -f "${VHOST_PATH}"
fi

# ── configtest (Apache/Nginx/Caddy) → rollback on failure ─────────────────────
if [[ -n "${CONFTEST_CMD}" ]]; then
  if ! ${CONFTEST_CMD} 2>/dev/null; then
    onx_log "${CONFTEST_CMD} failed after removal — restoring backup"
    if [[ "${SERVER}" == "openlitespeed" || "${SERVER}" == "litespeed" ]]; then
      mv "${BACKUP_PATH}" "${VHOST_PATH}"
    else
      mv "${BACKUP_PATH}" "${VHOST_PATH}"
    fi
    onx_die 4 "${CONFTEST_CMD} failed after vhost removal; file restored"
  fi
fi

# Cleanup backup
if [[ "${SERVER}" == "openlitespeed" || "${SERVER}" == "litespeed" ]]; then
  rm -rf "${BACKUP_PATH}"
else
  rm -f "${BACKUP_PATH}"
fi

# ── Reload ───────────────────────────────────────────────────────────────────
if ! ${RELOAD_CMD} >/dev/null 2>&1; then
  onx_die 3 "${RELOAD_CMD} failed"
fi

# ── Success ──────────────────────────────────────────────────────────────────
onx_json_out "removed" "true" "vhost_path" "${VHOST_PATH}" "server" "${SERVER}"
