# ==============================================================
# BAN YARO — Makefile
# Alle häufigen Operationen mit kurzen Befehlen.
# Verwendung: make <ziel>
# ==============================================================

# Konfiguration
DS_HOST     := ds
DS_IP       := 10.47.11.10
DS_SSH_PORT := 22
DS_PATH     := /volume1/docker/ban-yaro
CONTAINER   := ban-yaro
GIT_REMOTE  := origin

.PHONY: help deploy push pull logs logs-f shell db restart stop status build \
        clean-cache dev lint check-ssh

# ----------------------------------------------------------
# SSH-Prüfung — intern, wird von allen DS-Befehlen genutzt
# ----------------------------------------------------------
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 ""; \
		echo "  SSH-Port $(DS_SSH_PORT) ist geschlossen oder DS ist offline."; \
		echo "  → Port in der Fritz!Box / DS-Firewall öffnen, dann erneut versuchen."; \
		echo ""; \
		exit 1; \
	fi

# ----------------------------------------------------------
# Standard: Hilfe anzeigen
# ----------------------------------------------------------
help:
	@echo ""
	@echo "  Ban Yaro — verfügbare Befehle:"
	@echo ""
	@echo "  make deploy      Push zu Git + Rebuild auf DS (häufigster Befehl)"
	@echo "  make push        Nur Git push (ohne DS-Deploy)"
	@echo "  make pull        Nur auf DS pullen + neustarten (ohne Git push)"
	@echo "  make restart     Container neustarten (ohne Rebuild)"
	@echo "  make build       Nur Docker-Image neu bauen (ohne Start)"
	@echo "  make stop        Container stoppen"
	@echo "  make status      Container-Status auf DS anzeigen"
	@echo ""
	@echo "  make logs        Letzte 100 Log-Zeilen"
	@echo "  make logs-f      Log-Stream (live)"
	@echo "  make shell       Bash-Shell im Container"
	@echo "  make db          SQLite-Shell auf DS"
	@echo ""
	@echo "  make dev         Lokaler Entwicklungsserver (ohne Docker)"
	@echo "  make clean-cache Service Worker + Browser-Cache leeren (Push)"
	@echo ""

# ----------------------------------------------------------
# DEPLOY: Git push → DS pull → Rebuild → Neustart
# Das ist der Befehl den du am meisten nutzen wirst.
# ----------------------------------------------------------
deploy: check-ssh
	@echo "→ Git push..."
	@git push $(GIT_REMOTE) main
	@echo "→ DS: pull + rebuild + restart..."
	@ssh $(DS_HOST) "cd $(DS_PATH) && \
		git pull && \
		sudo docker compose down && \
		sudo docker compose build --no-cache && \
		sudo docker compose up -d && \
		echo '✓ Deploy fertig.' && \
		sudo docker compose logs --tail=20"

# ----------------------------------------------------------
# NUR Git push (z.B. um nur Code zu sichern)
# ----------------------------------------------------------
push:
	git push $(GIT_REMOTE) main

# ----------------------------------------------------------
# NUR auf DS deployen (ohne neuen Git push)
# z.B. wenn jemand anderes gepusht hat
# ----------------------------------------------------------
pull: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && \
		git pull && \
		sudo docker compose down && \
		sudo docker compose up -d --build && \
		echo '✓ Pull + Restart fertig.'"

# ----------------------------------------------------------
# Nur neustarten (kein Rebuild, kein Git)
# z.B. nach .env-Änderung
# ----------------------------------------------------------
restart: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && \
		sudo docker compose restart $(CONTAINER) && \
		echo '✓ Container neugestartet.'"

# ----------------------------------------------------------
# Nur bauen (kein Start)
# ----------------------------------------------------------
build: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && \
		sudo docker compose build --no-cache"

# ----------------------------------------------------------
# Stoppen
# ----------------------------------------------------------
stop: check-ssh
	@ssh $(DS_HOST) "cd $(DS_PATH) && sudo docker compose down"

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

# ----------------------------------------------------------
# LOGS
# ----------------------------------------------------------
logs: check-ssh
	@ssh $(DS_HOST) "sudo docker logs $(CONTAINER) --tail=100"

logs-f: check-ssh
	@ssh $(DS_HOST) "sudo docker logs $(CONTAINER) -f"

# ----------------------------------------------------------
# SHELL im Container
# ----------------------------------------------------------
shell: check-ssh
	@ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) bash"

# ----------------------------------------------------------
# SQLite direkt öffnen
# ----------------------------------------------------------
db: check-ssh
	@ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) \
		sqlite3 /data/banyaro.db"

# ----------------------------------------------------------
# Lokale Entwicklung (ohne Docker, direkt auf Mac)
# Voraussetzung: Python-Venv in backend/venv/
# ----------------------------------------------------------
dev:
	@cd backend && \
		test -d venv || python3 -m venv venv && \
		. venv/bin/activate && \
		pip install -q -r requirements.txt && \
		KI_MODE=off ENV=development \
		JWT_SECRET=dev-secret \
		DB_PATH=./dev.db \
		uvicorn main:app --reload --port 8001

# ----------------------------------------------------------
# Service-Worker-Cache auf DS forciert leeren
# (nach größeren CSS/JS-Änderungen sinnvoll)
# ----------------------------------------------------------
clean-cache:
	@ssh $(DS_HOST) "cd $(DS_PATH) && \
		sudo docker exec $(CONTAINER) \
		sed -i 's/by-v[0-9]*/by-v'$$(date +%s)'/g' /app/static/sw.js && \
		echo '✓ Cache-Version aktualisiert.'"
	@$(MAKE) restart
