#!/usr/bin/env bash
#
# Auf die vorige Veröffentlichung zurückschalten.
#
#     /var/www/ekdos/deploy/rollback.sh              # eine zurück
#     /var/www/ekdos/deploy/rollback.sh 2f9c1ab      # auf eine bestimmte
#     /var/www/ekdos/deploy/rollback.sh --list       # zeigt, was vorrätig ist
#
# Es wird nur der Symlink getauscht und php-fpm neu geladen. Die alten
# Veröffentlichungen liegen vollständig da, ein Rückschritt dauert Sekunden.
#
# ACHTUNG: Datenbankmigrationen werden NICHT zurückgenommen. Hat die neue
# Fassung das Schema geändert, muss die alte damit umgehen können. Bei den
# bisherigen Migrationen (nur Tabellen anlegen) ist das der Fall.

set -euo pipefail

ROOT="${EKDOS_ROOT:-/var/www/ekdos}"
FPM_SERVICE="${EKDOS_FPM:-php8.5-fpm}"
HEALTH_URL="${EKDOS_HEALTH_URL:-http://127.0.0.1/api/health}"

step() { printf '\n\033[1m==> %s\033[0m\n' "$1"; }
fail() { printf '\033[31mFEHLER: %s\033[0m\n' "$1" >&2; exit 1; }

CURRENT="$(basename "$(readlink "$ROOT/current" 2>/dev/null || echo none)")"

if [ "${1:-}" = "--list" ]; then
    echo "Vorrätige Veröffentlichungen (neueste zuerst):"
    ( cd "$ROOT/releases" && ls -1td -- */ | sed 's#/$##' ) | while read -r name; do
        [ "$name" = "$CURRENT" ] && echo "  * $name   (aktiv)" || echo "    $name"
    done
    exit 0
fi

TARGET="${1:-}"

if [ -z "$TARGET" ]; then
    # Ohne Argument: der Eintrag, den release.sh beim letzten Umschalten notiert hat.
    [ -f "$ROOT/previous" ] || fail "Keine vorige Veröffentlichung vermerkt. Auswahl zeigen mit: rollback.sh --list"
    TARGET="$(basename "$(cat "$ROOT/previous")")"
fi

[ -d "$ROOT/releases/$TARGET" ] || fail "Die Veröffentlichung '$TARGET' gibt es nicht. Auswahl zeigen mit: rollback.sh --list"
[ "$TARGET" != "$CURRENT" ]     || fail "'$TARGET' ist bereits aktiv."

step "Zurück von $CURRENT auf $TARGET"
ln -sfn "releases/$TARGET" "$ROOT/current.new"
mv -Tf "$ROOT/current.new" "$ROOT/current"
printf '%s\n' "$CURRENT" > "$ROOT/previous"

step "$FPM_SERVICE neu laden"
sudo systemctl reload "$FPM_SERVICE"

step "n8n-Cache verwerfen"
php "$ROOT/current/backend/bin/ekdos" cache:flush

step "Gesundheitsprüfung"
curl -fsS --max-time 5 "$HEALTH_URL" > /dev/null || fail "$HEALTH_URL antwortet nicht."

step "$TARGET ist wieder aktiv."
