#!/bin/bash
# deploy-on-host.sh — kontinuierliches Deploy auf dem VPS.
#
# Voraussetzung: install.sh ist einmalig gelaufen (Service, User, Dirs existieren).
# Aufruf auf dem Server als root:
#   cd /opt/stats/src
#   git pull
#   bash deploy/deploy-on-host.sh
#
# Idempotent. Fehlerfrei re-runnable.

set -euo pipefail

log()  { echo "[$(date -Iseconds)] $*"; }
die()  { echo "ERROR: $*" >&2; exit 1; }

if [[ $EUID -ne 0 ]]; then
    die "Muss als root laufen."
fi

INSTALL_DIR="/opt/stats"
REPO_DIR="${REPO_DIR:-$PWD}"
BINARY="$INSTALL_DIR/goatcounter"
PUBLIC_DIR="$INSTALL_DIR/public"

[[ -d "$INSTALL_DIR" ]] || die "$INSTALL_DIR existiert nicht. Bitte zuerst install.sh laufen lassen."

# ─── 1. Binary neu bauen (nur wenn Go verfügbar und Quellen lokal) ─────────
if command -v go &>/dev/null && [[ -d "$REPO_DIR/cmd/goatcounter" ]]; then
    log "Binary bauen"
    (cd "$REPO_DIR" && CGO_ENABLED=1 go build -trimpath -ldflags="-s -w" -o "$BINARY.new" ./cmd/goatcounter)
    mv "$BINARY.new" "$BINARY"
    chmod 755 "$BINARY"
    chown root:root "$BINARY"
else
    log "Go nicht verfügbar oder keine cmd/goatcounter — überspringe Build (Binary unverändert)"
fi

# ─── 2. Source-ZIP für EUPL-5 neu bauen ────────────────────────────────────
log "source.zip neu bauen"
mkdir -p "$PUBLIC_DIR"
(cd "$REPO_DIR" && REPO_DIR="$REPO_DIR" OUT_DIR="$PUBLIC_DIR" bash deploy/build-source-zip.sh)

# ─── 3. Caddy-Snippet installieren ─────────────────────────────────────────
log "Caddy-Snippet nach /etc/caddy/conf.d/stats.caddy"
install -m 0644 "$REPO_DIR/deploy/caddy/stats.caddy" /etc/caddy/conf.d/stats.caddy

log "Caddy-Syntax prüfen"
caddy validate --config /etc/caddy/Caddyfile || die "Caddy-Config ungültig — Deploy abgebrochen"

# ─── 4. systemd-Units aktualisieren (falls geändert) ───────────────────────
install -m 0644 "$REPO_DIR/deploy/stats.service"     /etc/systemd/system/stats.service
install -m 0644 "$REPO_DIR/deploy/stats-ask.service" /etc/systemd/system/stats-ask.service
systemctl daemon-reload

# ─── 5. Services neu starten ───────────────────────────────────────────────
log "Services neu starten"
systemctl restart stats-ask.service
systemctl restart stats.service

log "Caddy reload"
systemctl reload caddy

# ─── 6. Health-Check ───────────────────────────────────────────────────────
log "Health-Check"
for i in $(seq 1 15); do
    if curl -fsS http://127.0.0.1:8100/status >/dev/null 2>&1; then
        log "GoatCounter antwortet (nach ${i}s)"
        break
    fi
    [[ $i -eq 15 ]] && die "GoatCounter antwortet nicht — journalctl -u stats -n 50"
    sleep 1
done

curl -fsS "http://127.0.0.1:8101/ask?domain=stats.wise-relations.com" >/dev/null \
    || die "Ask-Server antwortet nicht — journalctl -u stats-ask -n 50"

log "Deploy fertig."
