#!/bin/sh
set -eu

REQUEST="/path/to/olivetin/export/device-sync/device-add.request"
CSV="/path/to/olivetin/config/geraeteliste.csv"
CHECK="/path/to/olivetin/config/scripts/pruefe-einzelgeraet.sh"
GENERATOR="/path/to/olivetin/config/scripts/geraeteliste-zu-entities.sh"
STATUS="/path/to/olivetin/export/device-sync/device-add.status"
LOCK="/tmp/olivetin-device-add.lock"

if [ ! -e "$REQUEST" ]; then
  echo "[BEREIT] Kein neuer Geräteauftrag vorhanden."
  exit 0
fi

if [ ! -f "$CSV" ]; then
  echo "[STOPP] Geräteliste fehlt: $CSV"
  exit 66
fi

CSV_OWNER="$(stat -c '%u:%g' "$CSV")"
CSV_MODE="$(stat -c '%a' "$CSV")"

mkdir "$LOCK" 2>/dev/null || {
  echo "[STOPP] Eine Geräteübernahme läuft bereits."
  exit 65
}

trap 'rmdir "$LOCK" 2>/dev/null || true' EXIT HUP INT TERM

IFS=';' read -r ID NAME IP MAC VPN DIRECT ACTIVE STARTWEG < "$REQUEST"

case "$ID" in
  ""|*[!a-z0-9_]*)
    echo "[STOPP] Ungültige geraete_id."
    exit 64
    ;;
esac

case "$STARTWEG" in
  vpn|direct) ;;
  *)
    echo "[STOPP] Ungültiger Startweg."
    exit 64
    ;;
esac

TMP="$CSV.tmp.$$"
BACKUP="$CSV.bak-before-device-add-$(date +%Y%m%d-%H%M%S)"

cp -p "$CSV" "$TMP"

if [ -s "$TMP" ] && [ "$(tail -c 1 "$TMP" | wc -l)" -eq 0 ]; then
  printf '\n' >> "$TMP"
fi

printf '%s;%s;%s;%s;%s;%s;%s\n' \
  "$ID" "$NAME" "$IP" "$MAC" "$VPN" "$DIRECT" "$ACTIVE" >> "$TMP"

if ! /bin/sh "$CHECK" "$TMP" "$ID" "$STARTWEG"; then
  rm -f "$TMP"
  echo "[STOPP] Neuer Datensatz wurde abgelehnt; CSV blieb unverändert."
  REJECTED="${REQUEST}.rejected-$(date +%Y%m%d-%H%M%S)"
  mv "$REQUEST" "$REJECTED"
  {
    echo "RESULT=ABGELEHNT"
    echo "ID=$ID"
    echo "NAME=$NAME"
    echo "IP=$IP"
    echo "MAC=$MAC"
    echo "ARCHIV=$REJECTED"
  } > "$STATUS"
  exit 66
fi

cp -p "$CSV" "$BACKUP"
find "$(dirname "$CSV")" -maxdepth 1 -type f -name "geraeteliste.csv.bak-before-device-add-*" -print | sort | awk '{f[NR]=$0} END {for(i=1;i<=NR-20;i++) print f[i]}' | xargs -r rm -f
mv "$TMP" "$CSV"
chown "$CSV_OWNER" "$CSV"
chmod "$CSV_MODE" "$CSV"

if ! "$GENERATOR"; then
  cat "$BACKUP" > "$CSV"
  chown "$CSV_OWNER" "$CSV"
  chmod "$CSV_MODE" "$CSV"
  "$GENERATOR" >/dev/null 2>&1 || true
  echo "[STOPP] Entity-Erzeugung fehlgeschlagen; CSV wurde zurückgesetzt."
  exit 67
fi

DONE="$REQUEST.processed-$(date +%Y%m%d-%H%M%S)"
mv "$REQUEST" "$DONE"

{
  echo "RESULT=OK"
  echo "ID=$ID"
  echo "NAME=$NAME"
  echo "IP=$IP"
  echo "MAC=$MAC"
  echo "STARTWEG=$STARTWEG"
  echo "BACKUP=$BACKUP"
  sha256sum "$CSV"
} > "$STATUS"

if docker restart olivetin-container >/dev/null 2>&1; then
  echo "OLIVETIN_RESTART=OK" >> "$STATUS"
else
  echo "OLIVETIN_RESTART=FEHLER" >> "$STATUS"
  echo "[STOPP] Gerät angelegt, aber OliveTin-Neustart fehlgeschlagen."
  cat "$STATUS"
  exit 68
fi

echo "[OK] Gerät wurde in die CSV übernommen."
cat "$STATUS"
echo "[OK] OliveTin-Auswahllisten wurden neu geladen."