# ==============================================================
# VEREINS.HAUS — Makefile
# Deploy-Strategie: SSH zur DS, Docker Compose
# Stack: SvelteKit + better-sqlite3 (kein PocketBase)
# ==============================================================

DS_HOST          := ds
DS_IP            := 10.47.11.10
DS_SSH_PORT      := 4711
DS_PATH          := /volume1/docker/vereinshaus
CONTAINER_APP    := vereinshaus-app
DOCKER           := sudo /usr/local/bin/docker

STAGING_PATH          := /volume1/docker/vereinshaus-staging
CONTAINER_APP_STAGING := vereinshaus-staging-app

TAR_EXCLUDE := --exclude='.git' \
               --exclude='./app/node_modules' \
               --exclude='./app/.svelte-kit' \
               --exclude='./app/build' \
               --exclude='./.env' \
               --exclude='./.DS_Store'

.PHONY: help check-ssh start stop restart status logs logs-app logs-f deploy \
        staging-deploy staging-reset staging-seed staging-logs staging-status staging-stop

# ----------------------------------------------------------
# Hilfe
# ----------------------------------------------------------
help:
	@echo ""
	@echo "  vereins.haus — verfügbare Befehle:"
	@echo ""
	@echo "  make deploy           App bauen + zur DS übertragen + Container neu starten"
	@echo "  make start            Container starten"
	@echo "  make stop             Container stoppen"
	@echo "  make restart          Container neu starten"
	@echo "  make status           Container-Status anzeigen"
	@echo "  make logs             App-Logs (100 Zeilen)"
	@echo "  make logs-f           App Live-Log"
	@echo ""
	@echo "  make staging-deploy   Staging deployen"
	@echo "  make staging-seed     Testdaten einfügen"
	@echo "  make staging-reset    Staging-DB löschen (Neustart)"
	@echo ""

# ----------------------------------------------------------
# SSH-Prüfung
# ----------------------------------------------------------
check-ssh:
	@if ! nc -z -w3 $(DS_IP) $(DS_SSH_PORT) 2>/dev/null; then \
		echo ""; \
		echo "  ✗ DS nicht erreichbar ($(DS_IP):$(DS_SSH_PORT))"; \
		echo ""; \
		exit 1; \
	fi

# ----------------------------------------------------------
# DEPLOY (Production)
# ----------------------------------------------------------
deploy: check-ssh
	@echo "→ Sync zu DS..."
	@COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/"
	@echo "→ .env auf DS aktualisieren..."
	@if [ -f .env ]; then \
		cat .env | ssh $(DS_HOST) "cat > $(DS_PATH)/.env"; \
	fi
	@echo "→ Docker rebuild + restart..."
	@ssh $(DS_HOST) " \
		cd $(DS_PATH) && \
		$(DOCKER) compose down && \
		$(DOCKER) compose build app && \
		$(DOCKER) compose up -d"
	@echo "  ✓ Deploy fertig."
	@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) --tail=15"

# ----------------------------------------------------------
# Container-Steuerung
# ----------------------------------------------------------
start: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose up -d"
	@echo "  ✓ Gestartet."

stop: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose down"
	@echo "  ✓ Gestoppt."

restart: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose restart"
	@echo "  ✓ Neugestartet."

status: check-ssh
	@ssh $(DS_HOST) "$(DOCKER) ps \
		--filter name=vereinshaus \
		--format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"

# ----------------------------------------------------------
# Logs
# ----------------------------------------------------------
logs: check-ssh
	@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) --tail=100"

logs-app: logs

logs-f: check-ssh
	@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) -f"

# ==============================================================
# STAGING
# ==============================================================

staging-deploy: check-ssh
	@echo "→ Sync zu DS (Staging)..."
	@COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(STAGING_PATH)/"
	@echo "→ .env auf DS (Staging)..."
	@if [ -f .env ]; then \
		cat .env | ssh $(DS_HOST) "cat > $(STAGING_PATH)/.env"; \
	fi
	@echo "→ Docker rebuild + restart (Staging)..."
	@ssh $(DS_HOST) " \
		cd $(STAGING_PATH) && \
		$(DOCKER) compose -f docker-compose.staging.yml down && \
		$(DOCKER) compose -f docker-compose.staging.yml build app-staging && \
		$(DOCKER) compose -f docker-compose.staging.yml up -d"
	@echo "  ✓ Staging bereit."
	@echo "  App: https://staging.vereins.haus"

# Löscht die SQLite-DB auf Staging → frischer Start
# Danach: make staging-deploy && make staging-seed
staging-reset: check-ssh staging-stop
	@echo "→ Staging-Daten löschen..."
	@ssh $(DS_HOST) "rm -f \
		$(STAGING_PATH)/data/vereinshaus.db \
		$(STAGING_PATH)/data/vereinshaus.db-wal \
		$(STAGING_PATH)/data/vereinshaus.db-shm && \
		rm -rf $(STAGING_PATH)/data/uploads"
	@echo "  ✓ Reset fertig. Jetzt: make staging-deploy && make staging-seed"

staging-seed:
	@echo "→ Testdaten in Staging einfügen..."
	@if [ -f .env ]; then \
		export $$(grep -v '^#' .env | xargs) && \
		APP_URL=https://staging.vereins.haus node scripts/seed.js; \
	else \
		APP_URL=https://staging.vereins.haus node scripts/seed.js; \
	fi

staging-logs: check-ssh
	@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP_STAGING) --tail=50"

staging-status: check-ssh
	@ssh $(DS_HOST) "$(DOCKER) ps \
		--filter name=vereinshaus-staging \
		--format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"

staging-stop: check-ssh
	@ssh $(DS_HOST) "cd $(STAGING_PATH) && $(DOCKER) compose -f docker-compose.staging.yml down"
	@echo "  ✓ Staging gestoppt."
