#!/bin/bash
# Falls versehentlich mit 'sh install-12er-depot.sh' aufgerufen (sh = dash auf
# Debian/Ubuntu, kann kein 'pipefail'): automatisch mit bash neu starten statt
# sofort mit "Illegal option -o pipefail" abzubrechen.
if [ -z "${BASH_VERSION:-}" ]; then
  exec bash "$0" "$@"
fi

set -euo pipefail

# --- Konfiguration ---------------------------------------------------
HOMEPAGE_BASE="https://depot.12er-haus.eu"
APP_VERSION="1.10.3"
APP_ZIP_URL="${HOMEPAGE_BASE}/downloads/12er-depot-${APP_VERSION}.zip"
DEPLOY_SCRIPT_URL="${HOMEPAGE_BASE}/downloads/deploy-12er-depot.sh"

BASE_DIR="/opt/12er-depot-app"
INSTALL_DIR="${BASE_DIR}/12er-depot"
# ---------------------------------------------------------------------

echo "================================"
echo " PreInstallation für 12er-depot "
echo "================================"
echo ""

# 0. Root-Check
if [ "$(id -u)" -ne 0 ]; then
  echo "FEHLER: Bitte als root ausführen (oder mit sudo)."
  exit 1
fi

export DEBIAN_FRONTEND=noninteractive

# 1. System updaten
echo "🖥️  System updaten"
apt-get update -qq
apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
  upgrade -y -qq
apt-get autoremove -y -qq

# 2. Erforderliche Pakete installieren
echo "📦  Erforderliche Pakete installieren"
apt-get install -y -qq curl unzip

# 3. Docker
echo "🧰  Prüfe/installiere Docker ..."
if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then
  echo "       Docker + Compose-Plugin bereits vorhanden, überspringe Installation."
else
  echo "       Installiere Docker über das offizielle Docker-Skript (get.docker.com) ..."
  curl -fsSL https://get.docker.com | sh
  systemctl enable --now docker >/dev/null 2>&1 || true
fi

# 4. Ordner
echo "📂  Lege Ordnerstruktur unter $BASE_DIR an ..."
mkdir -p "${BASE_DIR}/upload"
curl -fsSL "$DEPLOY_SCRIPT_URL" -o "${BASE_DIR}/deploy-12er-depot.sh"
chmod +x "${BASE_DIR}/deploy-12er-depot.sh"

# 5. App-ZIP herunterladen und entpacken
echo "⬇️  Lade 12er-Depot v${APP_VERSION} herunter und entpacke ..."
TMP_ZIP="$(mktemp /tmp/12er-depot-XXXXXX.zip)"
curl -fsSL "$APP_ZIP_URL" -o "$TMP_ZIP"
# -o = vorhandene Dateien ohne Rückfrage überschreiben (sonst hängt unzip bei
# einem erneuten Lauf interaktiv auf einer "replace? [y/n/A/N/r]"-Abfrage)
unzip -q -o "$TMP_ZIP" -d "$BASE_DIR"
rm -f "$TMP_ZIP"

if [ ! -f "${INSTALL_DIR}/docker-compose.yml" ]; then
  echo "FEHLER: Entpacken fehlgeschlagen – ${INSTALL_DIR}/docker-compose.yml nicht gefunden."
  exit 1
fi

# 6. .env mit sicheren, zufälligen Passwörtern erzeugen
echo "📝  Erzeuge .env mit automatisch generierten Passwörtern ..."
if [ -f "${BASE_DIR}/.env" ]; then
  echo "       ${BASE_DIR}/.env existiert bereits – wird NICHT überschrieben."
else
  gen_secret() { openssl rand -hex 24 2>/dev/null || head -c32 /dev/urandom | base64 | tr -d '=+/' | head -c32; }
  cp "${INSTALL_DIR}/.env.example" "${BASE_DIR}/.env"
  # Nur die Auto-generierbaren Vorlage-Platzhalter ersetzen –
  # DEPLOY_BASE_DIR/COMPOSE_PROJECT_* stehen schon korrekt in der Vorlage.
  sed -i "s#^POSTGRES_PASSWORD=.*#POSTGRES_PASSWORD=$(gen_secret)#" "${BASE_DIR}/.env"
  sed -i "s#^MINIO_SECRET_KEY=.*#MINIO_SECRET_KEY=$(gen_secret)#"   "${BASE_DIR}/.env"
  sed -i "s#^JWT_SECRET=.*#JWT_SECRET=$(gen_secret)#"               "${BASE_DIR}/.env"
fi
cp "${BASE_DIR}/.env" "${INSTALL_DIR}/.env"

# 7. Stack starten
echo "🛫  Starte Docker-Stack (erster Build kann einige Minuten dauern) ..."
cd "$INSTALL_DIR"
docker compose build --no-cache
docker compose up -d

SERVER_IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
APP_PORT="$(grep -E '^APP_PORT=' "${BASE_DIR}/.env" | cut -d= -f2)"
APP_PORT="${APP_PORT:-80}"

echo ""
echo "============================="
echo " Installation abgeschlossen! "
echo "============================="
echo ""
echo "  App erreichbar unter:  http://${SERVER_IP:-<server-ip>}:${APP_PORT}"
echo "  Zugangsdaten liegen in: ${BASE_DIR}/.env (automatisch generiert)"
echo ""
echo "  Nächste Schritte:"
echo "   1. Im Browser öffnen, ersten Benutzer anlegen (wird automatisch Admin)"
echo "   2. Unter System → Plugins die gewünschten Plugin-ZIPs installieren"
echo "   3. Künftige Updates laufen über System → Update in der App –"
echo "      dieses Skript wird dafür nicht mehr benötigt"
echo ""
