#!/usr/bin/env bash
# replaceschool.sh
# Usage: replaceschool.sh <original-file> [template-file]
# original-file wird überschrieben .

set -euo pipefail

if [ "${1-}" = "" ]; then
  echo "Nutzung: $0 <original-file> [template-file]" >&2
  exit 2
fi

OLD="$1"
SRC="${2:-docker-compose-school.yml}"
OUT="$OLD"

if [ ! -f "$OLD" ]; then
  echo "Fehler: Original-Datei '$OLD' nicht gefunden." >&2
  exit 1
fi
if [ ! -f "$SRC" ]; then
  echo "Fehler: Template-Datei '$SRC' nicht gefunden." >&2
  exit 1
fi

# Nummer extrahieren (versucht grep -P, sonst perl)
NUM=""
COMMENT=""
if grep -oP '^\s*#\s*School\s+\K\d+' "$OLD" >/dev/null 2>&1; then
  NUM=$(grep -Po '^\s*#\s*School\s+\K\d+' "$OLD" | head -n1)
  COMMENT=$(grep -Po '^\s*#\s*School\s+\d+\s*\K.*' "$OLD" | head -n1)
fi

if [ -z "$NUM" ]; then
  if grep -oP '(?<=LETTO_)\d+' "$OLD" >/dev/null 2>&1; then
    NUM=$(grep -oP '(?<=LETTO_)\d+' "$OLD" | head -n1)
  fi
fi

if [ -z "$NUM" ]; then
  NUM=$(perl -0777 -ne 'print $1 and exit if /# School (\d+)/m; print $1 and exit if /LETTO_(\d+)/m' "$OLD" || true)
fi

if [ -z "$NUM" ]; then
  echo "Konnte Nummer nicht finden (weder '# School N' noch 'LETTO_N' gefunden)" >&2
  exit 3
fi

# Suche nach dem Tag des DATA-Services
datatag="stable"
if grep -oP '(?<=image: lettohub/letto-service-data:)[a-zA-Z0-9\-_.-]+' "$OLD" >/dev/null 2>&1; then
  datatag=$(grep -Po '(?<=image: lettohub/letto-service-data:)[a-zA-Z0-9\-_.-]+' "$OLD" | head -n1)
fi

# Suche nach dem Tag des Lettoserver
lettoservertag="stable"
if grep -oP '(?<=image: lettohub/lettoserver:)[a-zA-Z0-9\-_.-]+' "$OLD" >/dev/null 2>&1; then
  lettoservertag=$(grep -Po '(?<=image: lettohub/lettoserver:)[a-zA-Z0-9\-_.-]+' "$OLD" | head -n1)
fi

# Suche nach dem letzten Tag eines lettohub-Services
lettotag="stable"
if grep -oP 'image: lettohub/[a-zA-Z0-9\-_.-]+:\K[a-zA-Z0-9\-_.-]+' "$OLD" >/dev/null 2>&1; then
  lettotag=$(grep -Po 'image: lettohub/[a-zA-Z0-9\-_.-]+:\K[a-zA-Z0-9\-_.-]+' "$OLD" | head -n1)
fi

# Validierung 1..1000
if ! [[ "$NUM" =~ ^[0-9]+$ ]]; then
  echo "Gefundener Wert '$NUM' ist keine Zahl." >&2
  exit 4
fi
if [ "$NUM" -lt 1 ] || [ "$NUM" -gt 1000 ]; then
  echo "Gefundene Nummer '$NUM' ausserhalb Bereich 1..1000." >&2
  exit 5
fi

DATA_DEBUG_PORT=$((4200 + NUM))
LETTO_DEBUG_PORT=$((4100 + NUM))
sed -E "
  s/(\b|[^A-Za-z0-9_])# School [0-9]+/\1# School ${NUM} ${COMMENT}/g;
  s/(\b|[^A-Za-z0-9_])LETTO_[0-9]+/\1LETTO_${NUM}/g;
  s/(\b|[^A-Za-z0-9_])data[0-9]+:/\1data${NUM}:/g;
  s/(\b|[^A-Za-z0-9_])letto[0-9]+:/\1letto${NUM}:/g;
  s/(image: lettohub\/[A-Za-z0-9_.-]+:)[A-Za-z0-9_][A-Za-z0-9_.-]*/\1${lettotag}/g;
  s/(image: lettohub\/letto-service-data:)[A-Za-z0-9_][A-Za-z0-9_.-]*/\1${datatag}/g;
  s/(image: lettohub\/lettoserver:)[A-Za-z0-9_][A-Za-z0-9_.-]*/\1${lettoservertag}/g;
  s/(DEBUG_PORT_LETTO:-)4100(\}:5080)/\1${LETTO_DEBUG_PORT}\2/g;
  s/(DEBUG_PORT_DATA:-)4200(\}:5300)/\1${DATA_DEBUG_PORT}\2/g;
" "$SRC" > "$OUT"

echo "OK: $OUT mit Nummer $NUM erstellt. Letto:$lettotag, Data: $datatag, Lettoserver: $lettoservertag"
exit 0
