#!/bin/bash
# espo-compose-rendern - schreibt /srv/espo/docker-compose.yml aus dem Stand des jeweiligen Rings.
# Aufruf: espo-compose-rendern <fqdn> <ring>   (aus ESPO-10-Deploy; fqdn und ring kommen aus den Custom Fields)
# Idempotent: gleiche Eingabe, gleiche Datei; geschrieben wird nur bei Unterschied.
set -u

BASIS_URL=https://gitea.subcura.net/EspoCRM_Public/espo-deploy/raw/branch/main/docker
ZIEL=/srv/espo/docker-compose.yml
FQDN="${1:-}"
RING="${2:-}"

# 1. Ohne gueltigen FQDN waeren Site-URL und WebSocket-Adresse falsch - hier abbrechen, nicht spaeter raten.
if ! printf '%s' "$FQDN" | grep -Eq '^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$'; then
  echo "FEHLER: kein gueltiger FQDN uebergeben ('$FQDN')"
  echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1
fi

# 2. Der Ring bestimmt, welcher Stand gilt. Die Ordnernamen im Repo tragen Leerzeichen, daher kodiert.
case "$RING" in
  0) ORDNER="0%20-%20intern"          ; KLAR="0 - intern" ;;
  1) ORDNER="1%20-%20Pilotkunde"      ; KLAR="1 - Pilotkunde" ;;
  2) ORDNER="2%20-%20Produktivkunde"  ; KLAR="2 - Produktivkunde" ;;
  *) echo "FEHLER: unbekannter Ring '$RING' (erwartet 0, 1 oder 2)"
     echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1 ;;
esac

# 3. Stand des Rings holen - geheimnisfrei und ohne Anmeldung abrufbar.
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
curl -fsSL "$BASIS_URL/$ORDNER/docker-compose.yml" -o "$TMP/stand.yml" || {
  echo "FEHLER: fuer Ring '$KLAR' ist kein Stand hinterlegt oder das Repository ist nicht erreichbar"
  echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1; }

# 4. Platzhalter ersetzen.
sed "s|__FQDN__|${FQDN}|g" "$TMP/stand.yml" > "$TMP/neu.yml"

# 5. Kein Platzhalter darf uebrig bleiben, sonst startete Docker mit einer unfertigen Datei.
OFFEN="$(grep -oE '__[A-Z][A-Z0-9_]*__' "$TMP/neu.yml" | sort -u | tr '\n' ' ')"
if [ -n "$OFFEN" ]; then
  echo "FEHLER: unersetzte Platzhalter: $OFFEN"
  echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1
fi

# 6. Die drei EspoCRM-Dienste teilen ueber volumes_from denselben Code - verschiedene Images waeren ein Fehler.
if [ "$(grep -E '^[[:space:]]+image: espocrm' "$TMP/neu.yml" | sort -u | wc -l)" -ne 1 ]; then
  echo "FEHLER: die EspoCRM-Dienste verwenden verschiedene Images"
  echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1
fi

# 7. Nur bei Unterschied schreiben, damit wiederholte Laeufe nichts anfassen.
install -d -m 0755 /srv/espo
if [ -f "$ZIEL" ] && cmp -s "$TMP/neu.yml" "$ZIEL"; then
  STATUS=UNVERAENDERT
else
  install -m 0644 "$TMP/neu.yml" "$ZIEL"
  STATUS=GEAENDERT
fi

# 8. Docker selbst pruefen lassen, sobald die Geheimnisdateien liegen - startet nichts.
if [ -r /srv/espo/secrets/db_password ]; then
  docker compose -f "$ZIEL" config -q || {
    echo "FEHLER: Compose-Datei nicht gueltig"
    echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1; }
fi

echo "$ZIEL $STATUS (Ring '$KLAR', FQDN $FQDN)"
echo "ESPO_COMPOSE_ERGEBNIS: OK"
