#!/usr/bin/env bash
set -Eeuo pipefail

# Das Skript außerhalb des Checkouts weiterführen, damit ein Pull seine laufende
# Version nicht verändern kann.
if [[ "${KULTOUR_UPDATE_REEXEC:-0}" != "1" ]]; then
    stable_script="$(mktemp "${TMPDIR:-/tmp}/kultour-update.XXXXXX")"
    cp -- "$0" "$stable_script"
    chmod 700 "$stable_script"
    export KULTOUR_UPDATE_REEXEC=1
    export KULTOUR_UPDATE_TEMP_SCRIPT="$stable_script"
    exec bash "$stable_script" "$@"
fi

repository_input="${1:-.}"
cd "$repository_input"
repository_root="$(git rev-parse --show-toplevel)"
cd "$repository_root"

repository_parent="$(dirname "$repository_root")"
update_backup="$(mktemp -d "${repository_parent}/kultour-update-backup.XXXXXX")"
restore_required=0

cleanup_temp_script() {
    if [[ -n "${KULTOUR_UPDATE_TEMP_SCRIPT:-}" && -f "$KULTOUR_UPDATE_TEMP_SCRIPT" ]]; then
        rm -f -- "$KULTOUR_UPDATE_TEMP_SCRIPT"
    fi
}

restore_persistence() {
    mkdir -p "$repository_root/data" "$repository_root/uploads"
    cp -a -- "$update_backup/data/." "$repository_root/data/"
    cp -a -- "$update_backup/uploads/." "$repository_root/uploads/"
    cp -a -- "$update_backup/config.php" "$repository_root/config.php"
}

handle_failure() {
    status=$?
    trap - ERR INT TERM
    if [[ "$restore_required" == "1" ]]; then
        echo "Update fehlgeschlagen – stelle Persistenz aus dem Backup wieder her ..." >&2
        restore_persistence || true
    fi
    echo "Backup bleibt erhalten: $update_backup" >&2
    cleanup_temp_script
    exit "$status"
}

trap handle_failure ERR INT TERM

for required_path in data uploads config.php; do
    if [[ ! -e "$repository_root/$required_path" ]]; then
        echo "Erforderlicher Pfad fehlt: $repository_root/$required_path" >&2
        exit 1
    fi
done

cp -a -- "$repository_root/data" "$update_backup/data"
cp -a -- "$repository_root/uploads" "$update_backup/uploads"
cp -a -- "$repository_root/config.php" "$update_backup/config.php"
restore_required=1

echo "Persistenz gesichert: $update_backup"
echo "Aktueller Arbeitsstand:"
git status --short

# In älteren Versionen waren Datenbank und Bilder noch getrackt. Nur diese
# Pfade sowie die lokale Konfiguration werden für den Pull auf HEAD gesetzt.
git restore --source=HEAD --staged --worktree -- data uploads config.php
git fetch origin main
git merge --ff-only origin/main

restore_persistence
restore_required=0
trap - ERR INT TERM
cleanup_temp_script

echo "Update abgeschlossen. Datenbank, Uploads und config.php wurden wiederhergestellt."
echo "Sicherheits-Backup bleibt erhalten: $update_backup"
git status --short --branch
