#!/bin/bash
# restore-db.sh – Wetterstation PostgreSQL-Datenbank wiederherstellen
# Verwendung:
#   ./restore-db.sh                          # interaktiv – wählt aus vorhandenen Backups
#   ./restore-db.sh backups/wetterstation_20260502_0300.dump  # direkt mit Datei

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"
BACKUP_DIR="$SCRIPT_DIR/backups"
CONTAINER="wetterstation_db"

# ── .env laden ──────────────────────────────────────────────────────────────
if [[ ! -f "$ENV_FILE" ]]; then
  echo "FEHLER: .env nicht gefunden: $ENV_FILE"
  exit 1
fi
source "$ENV_FILE"

echo "=========================================="
echo " Wetterstation – DB-Restore"
echo "=========================================="
echo "  Datenbank : $DB_NAME"
echo "  Benutzer  : $DB_USER"
echo "  Container : $CONTAINER"
echo ""

# ── Backup-Datei bestimmen ────────────────────────────────────────────────
if [[ $# -ge 1 ]]; then
  DUMP_FILE="$1"
else
  # Interaktiv: alle *.dump-Dateien im Backup-Verzeichnis auflisten
  if [[ ! -d "$BACKUP_DIR" ]]; then
    echo "FEHLER: Backup-Verzeichnis nicht gefunden: $BACKUP_DIR"
    exit 1
  fi

  DUMPS=()
  while IFS= read -r line; do
    DUMPS+=("$line")
  done < <(find "$BACKUP_DIR" -name "*.dump" | sort -r)

  if [[ ${#DUMPS[@]} -eq 0 ]]; then
    echo "FEHLER: Keine Backup-Dateien in $BACKUP_DIR gefunden."
    exit 1
  fi

  echo "Verfügbare Backups (neuestes zuerst):"
  for i in "${!DUMPS[@]}"; do
    SIZE=$(du -sh "${DUMPS[$i]}" | cut -f1)
    echo "  [$((i+1))] $(basename "${DUMPS[$i]}")  ($SIZE)"
  done
  echo ""
  read -rp "Welches Backup wiederherstellen? [1-${#DUMPS[@]}]: " CHOICE

  if ! [[ "$CHOICE" =~ ^[0-9]+$ ]] || (( CHOICE < 1 || CHOICE > ${#DUMPS[@]} )); then
    echo "Ungültige Auswahl. Abbruch."
    exit 1
  fi

  DUMP_FILE="${DUMPS[$((CHOICE-1))]}"
fi

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

DUMP_SIZE=$(du -sh "$DUMP_FILE" | cut -f1)
echo "Gewähltes Backup : $(basename "$DUMP_FILE")  ($DUMP_SIZE)"
echo ""

# ── Sicherheitsabfrage ────────────────────────────────────────────────────
echo "WARNUNG: Der Restore überschreibt alle vorhandenen Daten in '$DB_NAME'!"
read -rp "Wirklich fortfahren? (ja/n): " CONFIRM

if [[ "$CONFIRM" != "ja" ]]; then
  echo "Abgebrochen."
  exit 0
fi

# ── Container prüfen ─────────────────────────────────────────────────────
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
  echo "FEHLER: Container '$CONTAINER' läuft nicht."
  echo "Starte ihn mit: docker compose up -d postgres"
  exit 1
fi

# ── Restore durchführen ──────────────────────────────────────────────────
echo ""
echo "Kopiere Dump in Container..."
docker cp "$DUMP_FILE" "${CONTAINER}:/tmp/restore.dump"

echo "Stelle Datenbank wieder her..."
docker exec "$CONTAINER" pg_restore \
  -U "$DB_USER" \
  -d "$DB_NAME" \
  --clean \
  --if-exists \
  --no-owner \
  --no-privileges \
  -F c \
  /tmp/restore.dump

echo "Räume auf..."
docker exec "$CONTAINER" rm /tmp/restore.dump

echo ""
echo "✓ Restore abgeschlossen: $(basename "$DUMP_FILE")"
