#!/bin/bash
# Paperless Restore-Skript 1:1 (Stand 27.10.2026, fuer Paperless-ngx 2 und 3)
# Stellt ein Archiv von backup_new.sh wieder her, Ownerships bleiben erhalten.
# Beispiel:
#   ./restore_new.sh paperless-backup-2025-09-23_08-13.tar.gz
#   ./restore_new.sh /home/paperless/paperless-backup-2025-09-23_08-13.tar.gz

set -euo pipefail

SOURCE_DIR="/data/paperless"
BACKUP_DIR="/home/paperless"

INPUT="${1:-}"

if [ -z "$INPUT" ]; then
  echo "Fehler: Bitte Archivdatei angeben!"
  echo "Beispiel:"
  echo "  $0 paperless-backup-2025-09-23_08-13.tar.gz"
  echo "  $0 /home/paperless/paperless-backup-2025-09-23_08-13.tar.gz"
  exit 1
fi

# Absoluter Pfad oder Dateiname?
if [[ "$INPUT" = /* ]]; then
  FULL_PATH="$INPUT"
else
  FULL_PATH="$BACKUP_DIR/$INPUT"
fi

if [ ! -f "$FULL_PATH" ]; then
  echo "Fehler: Datei $FULL_PATH nicht gefunden!"
  exit 1
fi

# Warnung, falls nicht als root: --same-owner wirkt dann nicht
if [ "$(id -u)" -ne 0 ]; then
  echo "Warnung: Skript nicht als root gestartet. --same-owner kann dann ignoriert werden."
fi

echo "[$(date)] Starte Restore von $FULL_PATH ..."

echo "Stoppe Docker-Container ..."
cd /home/paperless
docker compose down

echo "Loesche altes $SOURCE_DIR ..."
rm -rf "$SOURCE_DIR"

# Restore mit Erhalt der Owner/Group aus dem Archiv
# --numeric-owner: nutzt UID/GID statt Namen (robuster bei unterschiedlichen Benutzer-Namen)
# --same-owner: setzt Besitzer/Gruppen wie im Archiv (root benoetigt)
echo "Entpacke Backup (Owner/Gruppen bleiben erhalten) ..."
tar --extract --gzip \
    --file "$FULL_PATH" \
    --directory / \
    --numeric-owner \
    --same-owner

# Postgres-Datenverzeichnis: Backups von Installationen, die auf Postgres 17 umgestellt
# wurden, enthalten die Daten in postgresql/_datav17. Dann muss die Compose-Datei dorthin zeigen.
COMPOSE="/home/paperless/docker-compose.yml"
cp -a "$COMPOSE" "$COMPOSE.vor-restore-$(date +%Y%m%d-%H%M%S)"
PG_DIR=""; PG_VER=""
if [ -f "$SOURCE_DIR/postgresql/_datav17/PG_VERSION" ]; then
  PG_DIR="_datav17"; PG_VER=$(cat "$SOURCE_DIR/postgresql/_datav17/PG_VERSION")
elif [ -f "$SOURCE_DIR/postgresql/_data/PG_VERSION" ]; then
  PG_DIR="_data"; PG_VER=$(cat "$SOURCE_DIR/postgresql/_data/PG_VERSION")
fi
if [ -n "$PG_DIR" ]; then
  echo "Backup enthaelt eine Postgres-$PG_VER-Datenbank in postgresql/$PG_DIR."
  # Compose auf das richtige Datenverzeichnis und die passende Postgres-Version einstellen.
  # Eine Postgres-17-Installation kann Daten von Postgres 16 nicht direkt lesen.
  sed -i -E "s#/data/paperless/postgresql/_data[a-z0-9]*:#/data/paperless/postgresql/$PG_DIR:#" "$COMPOSE"
  sed -i -E "s#image: postgres:[0-9.]+#image: postgres:$PG_VER#" "$COMPOSE"
  echo "docker-compose.yml: image postgres:$PG_VER, Datenpfad postgresql/$PG_DIR"
  echo "Hinweis: Mit Postgres $PG_VER laeuft Paperless 3 problemlos. Ein Wechsel auf Postgres 17 ist optional (siehe Anhang im Blogbeitrag)."
fi

# Nach einem 1:1-Restore kann der Datenbankstand aelter sein als die installierte
# Paperless-Version (z. B. Backup aus Paperless 2, Installation mit Paperless 3).
# Das Upgrade-Skript bringt Datenbank und Compose-Datei in der richtigen Reihenfolge
# auf den Zielstand. Es liegt entweder neben diesem Skript oder in /home/paperless.
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
UPGRADE=""
for k in "$SCRIPT_DIR/upgrade_paperless_v3.sh" "/home/paperless/upgrade_paperless_v3.sh" "/root/upgrade_paperless_v3.sh"; do
  [ -f "$k" ] && { UPGRADE="$k"; break; }
done
if [ -n "$UPGRADE" ]; then
  echo "Starte Upgrade-Pruefung mit $UPGRADE ..."
  bash "$UPGRADE" --yes
else
  echo "Hinweis: upgrade_paperless_v3.sh nicht gefunden. Starte Container direkt ..."
  echo "Falls Paperless danach nicht startet: upgrade_paperless_v3.sh herunterladen und ausfuehren."
  docker compose up -d
fi

echo "[$(date)] Restore abgeschlossen."

# Optional: kurze Sichtpruefung der Ownerships
echo "Ownership-Check (kurz):"
for d in /data/paperless /data/paperless/media /data/paperless/postgresql /data/paperless/redis; do
  [ -d "$d" ] && ls -ld "$d"
done
