#!/usr/bin/env bash
# Leitstelle – ESX Admin Panel: Installation unter Linux
#
#   sudo ./install.sh                 Installation mit systemd-Dienst (empfohlen)
#   ./install.sh --no-service         nur Abhängigkeiten installieren, Start per ./start.sh
#
# Optionen:
#   --port 8080        Port des Panels (Standard 8080)
#   --host 127.0.0.1   Adresse, auf der das Panel lauscht (Standard 127.0.0.1)
#   --user leitstelle  Systembenutzer für den Dienst (Standard leitstelle)
#   --no-service       keinen systemd-Dienst einrichten
#   --yes              keine Rückfragen
set -euo pipefail

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PORT=8080
HOST=127.0.0.1
SVC_USER=leitstelle
SERVICE=1
YES=0
NAME=leitstelle

while [ $# -gt 0 ]; do
  case "$1" in
    --port) PORT="$2"; shift 2 ;;
    --host) HOST="$2"; shift 2 ;;
    --user) SVC_USER="$2"; shift 2 ;;
    --no-service) SERVICE=0; shift ;;
    --yes|-y) YES=1; shift ;;
    -h|--help) sed -n '2,13p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
    *) echo "Unbekannte Option: $1"; exit 1 ;;
  esac
done

c_ok()   { printf '\033[32m%s\033[0m\n' "$*"; }
c_warn() { printf '\033[33m%s\033[0m\n' "$*"; }
c_err()  { printf '\033[31m%s\033[0m\n' "$*" >&2; }
ask() { # ask "Frage" default(y/n)
  local q="$1" def="${2:-n}" a
  if [ "$YES" = 1 ]; then [ "$def" = y ]; return; fi
  read -r -p "$q [$( [ "$def" = y ] && echo J/n || echo j/N )] " a || true
  a="${a:-$def}"; [[ "$a" =~ ^[JjYy]$ ]]
}

echo "== Leitstelle – ESX Admin Panel: Installation =="
echo "Ordner: $DIR"

if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then c_err "Ungültiger Port: $PORT"; exit 1; fi

# ---------- Node.js prüfen ----------
need_node() {
  command -v node >/dev/null 2>&1 || return 0
  local major; major="$(node -p 'process.versions.node.split(".")[0]')"
  [ "$major" -lt 18 ]
}
if need_node; then
  c_warn "Node.js 18 oder neuer wird benötigt$(command -v node >/dev/null && echo " (gefunden: $(node -v))")."
  if [ "$(id -u)" = 0 ] && command -v apt-get >/dev/null 2>&1 && ask "Node.js 20 LTS jetzt über das NodeSource-Paketarchiv installieren?" n; then
    apt-get update -qq
    apt-get install -y -qq ca-certificates curl gnupg
    curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
    apt-get install -y -qq nodejs
  else
    echo "Bitte Node.js installieren (https://nodejs.org, Version LTS) und install.sh erneut starten."
    echo "Debian/Ubuntu:  curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs"
    exit 1
  fi
fi
c_ok "Node.js $(node -v) gefunden."

# ---------- Abhängigkeiten ----------
cd "$DIR"
echo "Installiere Abhängigkeiten …"
if [ -f package-lock.json ]; then npm ci --omit=dev --no-audit --no-fund; else npm install --omit=dev --no-audit --no-fund; fi
chmod +x start.sh update.sh uninstall.sh 2>/dev/null || true

# ---------- Grundkonfiguration ----------
if [ ! -f .env ]; then
  { echo "PANEL_HOST=$HOST"; echo "PANEL_PORT=$PORT"; } > .env
  c_ok ".env angelegt (PANEL_HOST=$HOST, PANEL_PORT=$PORT)."
else
  echo ".env existiert bereits und bleibt unverändert."
  PORT="$(grep -E '^PANEL_PORT=' .env | cut -d= -f2 || echo "$PORT")"; PORT="${PORT:-8080}"
  HOST="$(grep -E '^PANEL_HOST=' .env | cut -d= -f2 || echo "$HOST")"; HOST="${HOST:-127.0.0.1}"
fi
if [ "$HOST" = "0.0.0.0" ]; then
  c_warn "Achtung: Das Panel ist über alle Netzwerkschnittstellen erreichbar. Ohne HTTPS-Reverse-Proxy nicht empfehlenswert."
fi

URL_HOST="$HOST"; [ "$HOST" = "0.0.0.0" ] && URL_HOST="127.0.0.1"

# ---------- systemd-Dienst ----------
if [ "$SERVICE" = 1 ]; then
  if [ "$(id -u)" != 0 ]; then
    c_warn "Für den systemd-Dienst bitte mit sudo starten. Ohne Dienst weiter mit: ./start.sh"
    SERVICE=0
  elif ! command -v systemctl >/dev/null 2>&1 || [ ! -d /run/systemd/system ]; then
    c_warn "systemd nicht gefunden. Start stattdessen mit ./start.sh oder pm2 (siehe README)."
    SERVICE=0
  fi
fi

PROTECT_HOME=true
if [ "$SERVICE" = 1 ]; then
  case "$DIR" in
    /root|/root/*)
      c_err "Das Panel liegt unter /root. Der Dienst-Benutzer kann dort nicht hinein."
      echo "Bitte den Ordner verschieben, z. B.:  sudo mv \"$DIR\" /opt/leitstelle && cd /opt/leitstelle && sudo ./install.sh"
      exit 1 ;;
    /home|/home/*)
      c_warn "Das Panel liegt unter /home. Empfohlen ist /opt/leitstelle."
      if ! ask "Trotzdem hier installieren?" n; then echo "Abgebrochen."; exit 1; fi
      PROTECT_HOME=false ;;
  esac
  if ! id "$SVC_USER" >/dev/null 2>&1; then
    useradd --system --home-dir "$DIR" --no-create-home --shell /usr/sbin/nologin "$SVC_USER"
    c_ok "Systembenutzer $SVC_USER angelegt."
  fi
  chown -R "$SVC_USER":"$SVC_USER" "$DIR"
  chmod 750 "$DIR"
  [ -f "$DIR/config.json" ] && chmod 600 "$DIR/config.json"
  cat > /etc/systemd/system/$NAME.service <<UNIT
[Unit]
Description=Leitstelle – ESX Admin Panel
After=network-online.target mariadb.service mysql.service
Wants=network-online.target

[Service]
Type=simple
User=$SVC_USER
Group=$SVC_USER
WorkingDirectory=$DIR
ExecStart=$(command -v node) $DIR/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=$PROTECT_HOME
ReadWritePaths=$DIR

[Install]
WantedBy=multi-user.target
UNIT
  systemctl daemon-reload
  systemctl enable --now $NAME >/dev/null
  systemctl restart $NAME
  c_ok "Dienst '$NAME' eingerichtet und gestartet."
  echo "Warte auf den Start …"
  LINE=""
  for _ in $(seq 1 20); do
    sleep 1
    LINE="$(journalctl -u $NAME -n 50 --no-pager 2>/dev/null | grep -o 'http[^ ]*/setup.html?code=[^ ]*' | tail -1 || true)"
    if [ -n "$LINE" ] || journalctl -u $NAME -n 50 --no-pager 2>/dev/null | grep -q 'Verbunden mit'; then break; fi
  done
  echo
  if [ -n "$LINE" ]; then
    c_ok "Fertig. Öffne jetzt die Einrichtung im Browser:"
    echo "  $LINE"
    echo "Der Link gilt, bis eine Datenbank verbunden ist. Neu anzeigen: journalctl -u $NAME -n 30"
  elif journalctl -u $NAME -n 50 --no-pager 2>/dev/null | grep -q 'Verbunden mit'; then
    c_ok "Fertig. Das Panel ist bereits mit einer Datenbank verbunden: http://$URL_HOST:$PORT"
  else
    c_warn "Der Dienst läuft, aber der Einrichtungs-Link wurde noch nicht gefunden. Anzeigen mit: journalctl -u $NAME -n 30"
  fi
  echo
  echo "Befehle:  systemctl status $NAME | systemctl restart $NAME | journalctl -u $NAME -f"
else
  echo
  c_ok "Fertig. Panel starten mit:  ./start.sh"
  echo "In der Konsole erscheint dann der Einrichtungs-Link (http://$URL_HOST:$PORT/setup.html?code=…)."
fi

cat <<INFO

Nächste Schritte
  1. Einrichtung im Browser öffnen, Datenbank verbinden, Admin-Zugang anlegen.
  2. Von außen nur über HTTPS erreichbar machen: Beispiele in docs/Caddyfile.example und docs/nginx.conf.example.
     Liegt das Panel auf einem Server, erreichst du es ohne Proxy per SSH-Tunnel:
       ssh -L $PORT:127.0.0.1:$PORT benutzer@server   →   http://127.0.0.1:$PORT
  3. Optional Live-Anbindung: fivem/leitstelle_bridge in den resources-Ordner kopieren,
     Schlüssel erzeugen mit:  npm run token
INFO
