#!/bin/bash
# h42 del – veröffentlichten Dienst zurückbauen (Gegenstück zu h42 new), in umgekehrter Reihenfolge:
# nginx-vhost deaktivieren, Zertifikat aus der Erneuerung nehmen, Pi-hole-Eintrag und DNS-Eintrag löschen.
#   sudo h42 del <name|fqdn> [--skip schritt,...] [--purge] [--yes]
#     --skip   Schritte auslassen: vhost, cert, pihole, dns
#     --purge  zusätzlich vhost-Datei, Basic-Auth-Datei und Zertifikat löschen (sonst bleiben sie liegen)
#     --yes    ohne Rückfrage
# Prüft vorab je Schritt den Stand: Was nicht vorhanden ist, entfällt; ist gar nichts vorhanden, endet h42 del ohne
# Rückfrage mit Exit 0. Ohne --purge zählen liegengebliebene Dateien nicht als vorhanden.
# Der Docker-Container selbst bleibt unberührt. Zone ($DEFAULT_ZONE) und $PUBLIC_HOST lehnt h42 del ab.
set -euo pipefail
. "${H42_LIB:-/usr/lib/h42}/common.sh"
need_root

pos=(); skip=; purge=; yes=
while [ $# -gt 0 ]; do
  case $1 in
    --skip) skip=${2:-}; shift 2 || usage ;;
    --skip=*) skip=${1#*=}; shift ;;
    --purge) purge=--purge; shift ;;
    --yes|-y) yes=1; shift ;;
    -*) usage ;;
    *) pos+=("$1"); shift ;;
  esac
done
[ ${#pos[@]} -eq 1 ] || usage
fqdn=${pos[0]%.}; [[ $fqdn == *.* ]] || fqdn=$fqdn.$DEFAULT_ZONE
case $fqdn in "$DEFAULT_ZONE"|"$PUBLIC_HOST") die "$fqdn wird nicht zurückgebaut (Zone bzw. PUBLIC_HOST)" ;; esac
for s in ${skip//,/ }; do
  case $s in vhost|cert|pihole|dns) ;; *) die "unbekannter Schritt bei --skip: $s (vhost, cert, pihole, dns)" ;; esac
done
step() { [[ ,$skip, != *,$1,* ]]; }

steps=(); absent=(); todo=,
plan() {  # plan <schritt> <beschreibung>: Stand prüfen; nur was vorhanden oder nicht prüfbar ist, kommt in den Plan
  step "$1" || return 0
  local rc=0
  # shellcheck disable=SC2086
  h42 "$1" exists "$fqdn" $purge >/dev/null 2>&1 || rc=$?
  case $rc in
    0) steps+=("$2"); todo+=$1, ;;
    3) absent+=("$1") ;;
    *) steps+=("$2 (Stand nicht prüfbar, wird versucht)"); todo+=$1, ;;
  esac
}
plan vhost  "nginx-vhost deaktivieren${purge:+ und Datei + Basic-Auth löschen}"
plan cert   "Zertifikat aus der Erneuerung nehmen${purge:+ und löschen}"
plan pihole "Pi-hole-Eintrag löschen"
plan dns    "DNS-Eintrag auf $NS_SERVER löschen (A/AAAA/CNAME)"
if [ ${#steps[@]} -eq 0 ]; then
  [ ${#absent[@]} -gt 0 ] || die "nichts zu tun – alle Schritte übersprungen"
  echo "$fqdn: nichts vorhanden (geprüft: ${absent[*]}), nichts zu tun"
  exit 0
fi
echo "$fqdn zurückbauen:"; printf '  - %s\n' "${steps[@]}"
if [ ${#absent[@]} -gt 0 ]; then echo "nicht vorhanden, entfällt: ${absent[*]}"; fi
if [ -z "$yes" ]; then
  [ -t 0 ] || die "keine Rückfrage möglich – mit --yes bestätigen"
  read -r -p "Fortfahren? [j/N] " answer
  [[ $answer == [jJyY]* ]] || { echo "abgebrochen"; exit 1; }
fi

failed=()
run() {  # run <schritt> <befehl…>: Fehler merken und mit den übrigen Schritten weitermachen
  local s=$1; shift
  echo "== $s"; "$@" || { echo "Schritt $s fehlgeschlagen" >&2; failed+=("$s"); }
}
planned() { [[ $todo == *,$1,* ]]; }
if planned vhost;  then run vhost  h42 vhost del "$fqdn" $purge; fi
if planned cert;   then run cert   h42 cert del "$fqdn" $purge; fi
if planned pihole; then run pihole h42 pihole del "$fqdn"; fi
if planned dns;    then run dns    h42 dns del "$fqdn"; fi
[ ${#failed[@]} -eq 0 ] || die "nicht vollständig zurückgebaut, fehlgeschlagen: ${failed[*]}"
echo "$fqdn zurückgebaut"
