#!/usr/bin/env bash
# Idempotentes Provisioning: Stack starten, Migrationen, Assets, erster Admin.
# Ausführung aus dem Verzeichnis deploy/:  ./provision.sh
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

if ! command -v docker >/dev/null 2>&1; then
  echo "Docker wird benötigt." >&2
  exit 1
fi

DC=(docker compose)
if ! docker compose version >/dev/null 2>&1; then
  DC=(docker-compose)
fi

if [[ ! -f .env ]]; then
  echo "Datei deploy/.env fehlt. Kopiere deploy/.env.example nach deploy/.env und trage Hostname, Passwörter und ACME_EMAIL ein." >&2
  exit 1
fi

# Let's Encrypt Speicher für Traefik
mkdir -p traefik
if [[ ! -f traefik/acme.json ]] || [[ ! -s traefik/acme.json ]]; then
  printf '{}' > traefik/acme.json
fi
chmod 600 traefik/acme.json

echo "==> Build und Start (database, app, traefik)..."
"${DC[@]}" build --pull
"${DC[@]}" up -d

echo "==> Warte auf MariaDB..."
for i in $(seq 1 60); do
  if "${DC[@]}" exec -T database healthcheck.sh --connect --innodb_initialized 2>/dev/null; then
    break
  fi
  if [[ "$i" -eq 60 ]]; then
    echo "MariaDB wurde nicht rechtzeitig bereit." >&2
    exit 1
  fi
  sleep 2
done

echo "==> Doctrine-Migrationen..."
"${DC[@]}" exec -T -e APP_ENV=prod app php bin/console doctrine:migrations:migrate --no-interaction --env=prod

echo "==> Assets / Importmap..."
"${DC[@]}" exec -T -e APP_ENV=prod app php bin/console assets:install public --no-interaction --env=prod || true
"${DC[@]}" exec -T -e APP_ENV=prod app php bin/console importmap:install --no-interaction --env=prod || true

echo "==> Erster Admin (terraflow:tenant:bootstrap, idempotent)..."
"${DC[@]}" exec -T -e APP_ENV=prod app php bin/console terraflow:tenant:bootstrap --no-interaction --env=prod

echo "==> Fertig. Prüfe https://<TRAEFIK_HOST aus deploy/.env> — DNS muss vorher auf diesen Server zeigen (Let's Encrypt)."
