#!/bin/bash
# Openhouse für den Mac – startet Openhouse auf diesem Rechner und öffnet es im Browser.
# Daten: ~/Library/Application Support/Openhouse · Protokoll: openhouse.log im selben Ordner.
# Läuft mit dem bash 3.2 von macOS, braucht nur Bordmittel (curl, tar, shasum, openssl, osascript).
set -u

APP_CONTENTS="$(cd "$(dirname "$0")/.." && pwd)"
APP_CODE="$APP_CONTENTS/Resources/app"
SUPPORT="$HOME/Library/Application Support/Openhouse"
DATA="$SUPPORT/Daten"
LOG="$SUPPORT/openhouse.log"
NODE_VERSION="22.20.0"
PORT=4747

mkdir -p "$SUPPORT" "$DATA"
exec >>"$LOG" 2>&1
echo "---- $(date '+%Y-%m-%d %H:%M:%S') Start"

say() { /usr/bin/osascript -e "display notification \"$1\" with title \"Openhouse\"" >/dev/null 2>&1 || true; }
alert() { /usr/bin/osascript -e "display alert \"Openhouse\" message \"$1\" as critical" >/dev/null 2>&1 || true; }
healthy() { /usr/bin/curl -fsS --max-time 2 "http://localhost:$1/healthz" 2>/dev/null | grep -q '"ok":true'; }
port_busy() { /usr/bin/nc -z 127.0.0.1 "$1" >/dev/null 2>&1; }

# Läuft Openhouse schon? Dann nur öffnen.
for p in 4747 4748 4749 4750; do
  if healthy "$p"; then /usr/bin/open "http://localhost:$p/app"; exit 0; fi
done
while port_busy "$PORT" && [ "$PORT" -lt 4760 ]; do PORT=$((PORT + 1)); done
URL="http://localhost:$PORT"

# Node.js 22.13 oder neuer finden (eigene Kopie, Homebrew, nvm, System)
node_ok() {
  [ -x "$1" ] || return 1
  "$1" -e 'const [a,b]=process.versions.node.split(".").map(Number);process.exit(a>22||(a===22&&b>=13)?0:1)' >/dev/null 2>&1
}
NODE=""
for c in "$SUPPORT/node/bin/node" /opt/homebrew/bin/node /usr/local/bin/node "$HOME"/.nvm/versions/node/v2*/bin/node; do
  if node_ok "$c"; then NODE="$c"; break; fi
done

# Kein passendes Node.js: einmalig die offizielle Version von nodejs.org laden (ca. 45 MB) und prüfen
if [ -z "$NODE" ]; then
  case "$(/usr/bin/uname -m)" in arm64) ARCH=arm64 ;; *) ARCH=x64 ;; esac
  NAME="node-v$NODE_VERSION-darwin-$ARCH"
  TMP="$(/usr/bin/mktemp -d)"
  say "Openhouse wird zum ersten Mal eingerichtet. Das dauert etwa eine Minute."
  echo "Lade $NAME"
  if /usr/bin/curl -fsSL --retry 2 -o "$TMP/$NAME.tar.gz" "https://nodejs.org/dist/v$NODE_VERSION/$NAME.tar.gz" \
     && /usr/bin/curl -fsSL --retry 2 -o "$TMP/SHASUMS256.txt" "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt"; then
    WANT="$(/usr/bin/grep " $NAME.tar.gz\$" "$TMP/SHASUMS256.txt" | /usr/bin/awk '{print $1}')"
    HAVE="$(/usr/bin/shasum -a 256 "$TMP/$NAME.tar.gz" | /usr/bin/awk '{print $1}')"
    if [ -n "$WANT" ] && [ "$WANT" = "$HAVE" ]; then
      /usr/bin/tar -xzf "$TMP/$NAME.tar.gz" -C "$TMP" && rm -rf "$SUPPORT/node" && mv "$TMP/$NAME" "$SUPPORT/node"
    else
      echo "Prüfsumme stimmt nicht"
    fi
  fi
  rm -rf "$TMP"
  if node_ok "$SUPPORT/node/bin/node"; then NODE="$SUPPORT/node/bin/node"; else
    alert "Für den ersten Start braucht Openhouse einmalig eine Internetverbindung (Node.js, ca. 45 MB). Bitte prüfen Sie Ihre Verbindung und öffnen Sie Openhouse erneut."
    exit 1
  fi
fi
echo "Node: $NODE ($("$NODE" -v))"

# Eigene Schlüssel für diesen Mac (Zwei-Faktor-Geheimnisse, Einladungslinks) – einmalig erzeugt, nur für Sie lesbar
KEYS="$SUPPORT/schluessel.env"
if [ ! -f "$KEYS" ]; then
  umask 077
  { echo "MFA_KEY=$(/usr/bin/openssl rand -base64 32)"; echo "DATA_KEY=$(/usr/bin/openssl rand -base64 32)"; } > "$KEYS"
fi
set -a; . "$KEYS"; set +a

# Zertifikat für https://localhost: Banken leiten nach der Freigabe nur auf https zurück
TLS_CERT="$SUPPORT/localhost-zertifikat.pem"; TLS_KEY="$SUPPORT/localhost-schluessel.pem"
if [ ! -f "$TLS_CERT" ] || [ ! -f "$TLS_KEY" ]; then
  umask 077
  /usr/bin/openssl req -x509 -newkey rsa:2048 -nodes -keyout "$TLS_KEY" -out "$TLS_CERT" -days 3650 \
    -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" >/dev/null 2>&1 \
  || /usr/bin/openssl req -x509 -newkey rsa:2048 -nodes -keyout "$TLS_KEY" -out "$TLS_CERT" -days 3650 -subj "/CN=localhost" >/dev/null 2>&1 \
  || rm -f "$TLS_CERT" "$TLS_KEY"
fi
[ -f "$TLS_CERT" ] || TLS_CERT=""; [ -f "$TLS_KEY" ] || TLS_KEY=""

# Eigene Einstellungen (optional), z. B. ADMIN_EMAILS oder ENABLE_BANKING_* – siehe „Erste Schritte“
SETTINGS="$SUPPORT/einstellungen.env"
[ -f "$SETTINGS" ] && { set -a; . "$SETTINGS"; set +a; }

FIRST=0; [ -f "$SUPPORT/.eingerichtet" ] || FIRST=1

cd "$APP_CODE" || { alert "Die App ist unvollständig. Bitte laden Sie Openhouse neu herunter."; exit 1; }
env DATA_DIR="$DATA" PORT="$PORT" HOST=127.0.0.1 APP_URL="$URL" NODE_ENV=production OPENHOUSE_LOCAL=1 \
  MFA_KEY="$MFA_KEY" DATA_KEY="$DATA_KEY" LOCAL_TLS_CERT="$TLS_CERT" LOCAL_TLS_KEY="$TLS_KEY" \
  "$NODE" --disable-warning=ExperimentalWarning server.js &
PID=$!
trap 'kill $PID 2>/dev/null' TERM INT

for i in $(seq 1 60); do
  if healthy "$PORT"; then break; fi
  if ! kill -0 $PID 2>/dev/null; then alert "Openhouse konnte nicht starten. Details stehen in ~/Library/Application Support/Openhouse/openhouse.log"; exit 1; fi
  sleep 0.5
done

if [ "$FIRST" = 1 ]; then
  touch "$SUPPORT/.eingerichtet"
  /usr/bin/open "$URL/"
  say "Openhouse läuft. Registrieren Sie sich im Browser – E-Mails stehen im Postausgang."
else
  /usr/bin/open "$URL/app"
  say "Openhouse läuft auf diesem Mac."
fi
wait $PID
echo "Beendet"
