.PHONY: install dev prod stop logs remove auth sync sync-projects sync-all sync-all-reverse projects searxng ollama qa test test-e2e train train-init

COMPOSE = docker compose

auth:
	@mkdir -p .claude-data storage projects uni
	@chown -R 1000:1000 .claude-data storage projects uni
	@grep -q "^CLAUDE_CODE_OAUTH_TOKEN=.\+" .env 2>/dev/null \
		|| echo "WARNUNG: CLAUDE_CODE_OAUTH_TOKEN fehlt in .env (Claude-Provider inaktiv)."
	@grep -q "^MINIMAX_API_KEY=.\+" .env 2>/dev/null \
		|| echo "WARNUNG: MINIMAX_API_KEY fehlt in .env (MiniMax-Provider inaktiv)."
	@echo "Verzeichnisse angelegt und auf uid 1000 chowned."

install:
	pip install --break-system-packages fastapi uvicorn[standard] aiosqlite uv playwright transformers trafilatura pymupdf4llm
	pip install --break-system-packages torch --index-url https://download.pytorch.org/whl/cpu
	python3 -m playwright install chromium
	@echo "Falls Chromium OS-Libs fehlen: 'sudo python3 -m playwright install-deps chromium' einmalig ausführen."
	@which pdftotext >/dev/null 2>&1 || sudo apt-get install -y poppler-utils
	@which tesseract >/dev/null 2>&1 || sudo apt-get install -y tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng
	cd frontend && npm install
	npm install -g opencode-ai
	@mkdir -p $(HOME)/.config/opencode
	@ln -sfn $(CURDIR)/dev-ops/opencode.json $(HOME)/.config/opencode/opencode.json
	@if grep -q "^MINIMAX_API_KEY=.\+" .env 2>/dev/null; then \
		echo "OpenCode-Config verlinkt. MINIMAX_API_KEY aus .env wird von 'make dev' geladen."; \
	else \
		echo "OpenCode-Config verlinkt. MINIMAX_API_KEY noch in .env eintragen."; \
	fi

dev:
	@echo "Backend: http://localhost:8000"
	@echo "Frontend: http://localhost:5173"
	@set -a; [ -f .env ] && . ./.env; set +a; \
		cd backend && uvicorn main:app --reload --port 8000 &
	@cd frontend && npx vite --port 5173

prod: auth
	$(COMPOSE) up -d --build

stop:
	-@pkill -f "uvicorn main:app" 2>/dev/null
	-@pkill -f "vite --port 5173" 2>/dev/null
	$(COMPOSE) down
	@echo "Server gestoppt."

logs:
	$(COMPOSE) logs -f

remove: stop
	@echo "Lösche Datenbank und generierte Dateien..."
	rm -rf storage/*
	@echo "Fertig."

searxng:
	docker run -d --name searxng --restart unless-stopped -p 8888:8080 searxng/searxng
	@echo "SearxNG läuft auf http://localhost:8888 (Websuche für den Lokal-Provider)."

ollama:
	@which ollama >/dev/null 2>&1 || curl -fsSL https://ollama.com/install.sh | sh
	ollama pull qwen3.6:27b
	ollama pull qwen3.5:9b
	@echo "Ollama bereit — Provider 'Lokal' ist aktiv (Modelle anpassen: backend/config.py + dev-ops/opencode.json)."

# Remote wird für die DB-Kopie gestoppt (sonst reißt der Snapshot mitten im Schreibvorgang)
# und danach wieder gestartet.
sync: stop
	@mkdir -p storage/topics uni
	@rm -f storage/creator.db-shm storage/creator.db-wal
	ssh root@178.104.67.87 'cd /var/www/creator && docker compose down'
	rsync -avz --progress root@178.104.67.87:/var/www/creator/storage/creator.db storage/
	-rsync -avz --progress root@178.104.67.87:/var/www/creator/storage/creator.db-wal storage/
	rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/storage/topics/ storage/topics/
	rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/uni/ uni/
	ssh root@178.104.67.87 'cd /var/www/creator && docker compose up -d'
	@echo "Sync abgeschlossen — Remote läuft wieder."

# Projekte vom Server holen: `make sync-projects` (auch: `make sync projects`).
# Mit --delete — exakter Spiegel: lokale Projekte ohne Server-Pendant werden gelöscht.
sync-projects:
	@mkdir -p projects
	rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/projects/ projects/
	@echo "Projekt-Sync abgeschlossen."

sync-all: sync sync-projects
	@echo "Voller Sync (Themen + Projekte) abgeschlossen."

# Gegenstück zu sync-all: lokalen Stand auf den Server schieben (Local → Remote).
# Stoppt den Remote-Server (DB-Sicherheit), pusht DB + Themen + Projekte, startet ihn neu.
# --delete = exakter Spiegel: Remote-Dateien ohne lokales Pendant werden gelöscht.
sync-all-reverse: stop
	@echo "ACHTUNG: überschreibt den Remote-Stand (DB, topics/, uni/, projects/) mit dem lokalen."
	@[ -f storage/creator.db ] || { echo "Keine lokale DB — abgebrochen."; exit 1; }
	ssh root@178.104.67.87 'cd /var/www/creator && docker compose down'
	ssh root@178.104.67.87 'rm -f /var/www/creator/storage/creator.db-shm /var/www/creator/storage/creator.db-wal'
	rsync -avz --progress storage/creator.db root@178.104.67.87:/var/www/creator/storage/
	@[ -f storage/creator.db-wal ] && rsync -avz --progress storage/creator.db-wal root@178.104.67.87:/var/www/creator/storage/ || true
	rsync -avz --progress --delete storage/topics/ root@178.104.67.87:/var/www/creator/storage/topics/
	rsync -avz --progress --delete uni/ root@178.104.67.87:/var/www/creator/uni/
	rsync -avz --progress --delete projects/ root@178.104.67.87:/var/www/creator/projects/
	ssh root@178.104.67.87 'cd /var/www/creator && docker compose up -d --build'
	@echo "Reverse-Sync abgeschlossen — Remote läuft wieder."

# QA-Report über einen abgeschlossenen Lauf (read-only): make qa TOPIC=aak
qa:
	@[ -n "$(TOPIC)" ] || { echo "Nutzung: make qa TOPIC=<thema> [LLM=1]"; exit 1; }
	@set -a; [ -f .env ] && . ./.env; set +a; \
		cd backend && python3 qa.py "$(TOPIC)" $(if $(LLM),--llm,)

# Guide-QA über einen gebauten Guide (read-only): make qa-guide TOPIC=Markdown [LLM=1]
qa-guide:
	@[ -n "$(TOPIC)" ] || { echo "Nutzung: make qa-guide TOPIC=<thema> [LLM=1]"; exit 1; }
	@set -a; [ -f .env ] && . ./.env; set +a; \
		cd backend && python3 guide_qa.py "$(TOPIC)" $(if $(LLM),--llm,)

projects: sync-projects

# Backend-Testsuite (Injektionstests + Fake-E2E, keine echten Agenten)
test:
	cd backend && python3 -m pytest tests/ -q

# Nur die Fake-E2E-Läufe (kompletter Generierungspfad in Sekunden)
test-e2e:
	cd backend && python3 -m pytest tests/test_e2e_fake.py -q

# Parameter-Training auf Mini-Themen: make train [TRIALS=40] [STUNDEN=12]
# Achtung: jeder Trial ist ein echter Mini-Lauf (MiniMax-Tokens, Minuten).
train:
	@set -a; [ -f .env ] && . ./.env; set +a; \
		cd backend && python3 train.py --trials $(or $(TRIALS),40) --stunden $(or $(STUNDEN),12) --ameisen $(or $(AMEISEN),3)

# Frozen-Inventar-Vorlage für das Training bauen (einmalig, echter Mini-Lauf)
train-init:
	@set -a; [ -f .env ] && . ./.env; set +a; \
		cd backend && python3 train.py --init
