#!/usr/bin/env bash
set -euo pipefail

REPO_DIR="/root/opt/bunkerserver/NewsSite"
BRANCH="main"

BLUE="server-app-blue"
GREEN="server-app-green"

HEALTH_PATH="/health"     # falls du keinen hast: "/" nehmen
HEALTH_TIMEOUT=60

lock="/tmp/deploy_newssite.lock"
exec 9>"$lock"
flock -n 9 || { echo "Deploy läuft schon."; exit 1; }

log() { echo "[$(date -Is)] $*"; }

wait_healthy() {
  local svc="$1"
  local deadline=$(( $(date +%s) + HEALTH_TIMEOUT ))
  log "Warte bis $svc healthy ist…"

  while (( $(date +%s) < deadline )); do
    local cid
    cid="$(docker compose ps -q "$svc" || true)"
    if [[ -n "$cid" ]]; then
      # test via wget oder curl im container (eins von beiden sollte meistens da sein)
      if docker exec "$cid" sh -lc "command -v curl >/dev/null && curl -fsS http://127.0.0.1:8080${HEALTH_PATH} >/dev/null" 2>/dev/null; then
        log "$svc healthy ✅"
        return 0
      fi
      if docker exec "$cid" sh -lc "command -v wget >/dev/null && wget -qO- http://127.0.0.1:8080${HEALTH_PATH} >/dev/null" 2>/dev/null; then
        log "$svc healthy ✅"
        return 0
      fi
    fi
    sleep 2
  done

  log "Healthcheck failed für $svc ❌"
  docker compose logs --tail=200 "$svc" || true
  return 1
}

log "1) Git Pull (hart auf origin/$BRANCH)"
cd "$REPO_DIR"
git fetch origin "$BRANCH"
git reset --hard "origin/$BRANCH"

SHA="$(git rev-parse --short HEAD)"
TAG="bunker-server-app:${SHA}"
log "2) Build Image: $TAG"
docker build -t "$TAG" ./server-app

# Green bekommt neues Tag (damit green garantiert neu ist)
docker tag "$TAG" bunker-server-app:green
# Blue bekommt später neues Tag
docker tag "$TAG" bunker-server-app:blue

log "3) GREEN starten (parallel, ohne Downtime)"
# Wichtig: Compose-Override nur fürs Image wäre am saubersten – hier nutzen wir Tags:
# => dafür muss in compose beim service-image statt latest die tags green/blue stehen (siehe Hinweis unten)
docker compose up -d --no-deps --force-recreate "$GREEN"
wait_healthy "$GREEN"

log "4) BLUE ersetzen (während GREEN ausliefert)"
docker compose up -d --no-deps --force-recreate "$BLUE"
wait_healthy "$BLUE"

log "5) GREEN stoppen & entfernen"
docker compose stop "$GREEN" || true
docker compose rm -f "$GREEN" || true

log "Deploy abgeschlossen ✅"