# FlorianNetz — Makefile
# Lokale Entwicklung, Datenbank (Migrationen/Seeds) und Deployment (externes Traefik).
#
# Schnellstart (lokal, Postgres via Docker):
#   make setup            # install + Postgres hoch + migrate + seed-all
#   make dev              # Dev-Server  ->  http://localhost:3000
#
# Nur Build + Migrate (z. B. CI / vor Deploy):
#   make build-app migrate
#
# Voll-Deploy hinter externem Traefik (Docker):
#   docker network create frontend   # einmalig (externes Traefik-Netz)
#   make deploy
#
# `make help` listet alle Ziele.

SHELL := /bin/bash
COMPOSE     = docker compose --env-file .env
# Lokale DB-Ziele binden den Dev-Override ein (veröffentlicht Postgres-Port 5432).
COMPOSE_DEV = docker compose --env-file .env -f docker-compose.yml -f docker-compose.dev.yml

.DEFAULT_GOAL := help

# ---------------------------------------------------------------------------
.PHONY: help
help: ## Diese Übersicht anzeigen
	@grep -hE '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
		| awk 'BEGIN{FS=":.*?## "}{printf "  \033[36m%-18s\033[0m %s\n", $$1, $$2}'

# --- Umgebung -------------------------------------------------------------
.PHONY: env install
env: ## .env aus .env.example erzeugen (falls noch nicht vorhanden)
	@if [ ! -f .env ]; then cp .env.example .env && echo "→ .env aus .env.example erstellt (Werte anpassen!)"; else echo "→ .env existiert bereits"; fi

install: ## npm-Abhängigkeiten installieren
	npm install

# --- Lokale Entwicklung & Qualität ---------------------------------------
.PHONY: dev build-app lint typecheck test test-cov check
dev: ## Next.js Dev-Server (http://localhost:3000)
	npm run dev

build-app: ## Next.js Production-Build (ohne Docker)
	npm run build

lint: ## ESLint
	npm run lint

typecheck: ## TypeScript prüfen (tsc --noEmit)
	npm run typecheck

test: ## Unit-Tests (Vitest)
	npm run test

test-cov: ## Unit-Tests mit Coverage
	npm run test:coverage

check: lint typecheck test ## Lint + Typecheck + Unit-Tests (Offline-DoD)

# --- E2E (braucht laufenden Server + Browser) ----------------------------
.PHONY: e2e-install e2e e2e-gating
e2e-install: ## Playwright-Browser installieren (einmalig)
	npx playwright install

e2e: ## Komplette Playwright-E2E-Suite
	npm run test:e2e

e2e-gating: ## Nur die Default-deny-Gating-Suite
	npm run test:e2e:gating

# --- Datenbank (lokal; Postgres via Docker, Port auf Host veröffentlicht) -
.PHONY: db-up db-down db-wait generate migrate seed-auth seed seed-all db-check studio db-reset
db-up: ## Nur Postgres starten (Docker, Port 5432 lokal)
	$(COMPOSE_DEV) up -d postgres

db-down: ## Postgres-Container stoppen
	$(COMPOSE_DEV) stop postgres

db-wait: ## Warten bis Postgres bereit ist (max ~60s)
	@echo "→ Warte auf Postgres…"; \
	for i in $$(seq 1 30); do \
		if $(COMPOSE_DEV) exec -T postgres sh -c 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"' >/dev/null 2>&1; then \
			echo "→ Postgres bereit."; exit 0; \
		fi; sleep 2; \
	done; echo "✗ Postgres nicht bereit (Timeout)."; exit 1

generate: ## Drizzle-Migration aus dem Schema generieren
	npm run db:generate

migrate: ## Migrationen anwenden (DATABASE_URL aus .env -> localhost:5432)
	npm run db:migrate

seed-auth: ## Ersten Platform-Admin anlegen (idempotent)
	npm run db:seed-auth

seed: ## NÖ-Katalog seeden: Merkmale/Vorlagen/Kategorien (idempotent)
	npm run db:seed

seed-all: seed-auth seed ## Auth- + Katalog-Seed

db-check: ## Drizzle-Schema-/Migrationskonsistenz prüfen (offline)
	npm run db:check

studio: ## Drizzle Studio öffnen (DB-Browser)
	npm run db:studio

db-reset: ## ACHTUNG: Postgres-Volume löschen, neu migrieren + seeden
	$(COMPOSE_DEV) rm -sf postgres
	-docker volume rm florian-netz_postgres-data
	$(MAKE) db-up db-wait migrate seed-all

# --- Erststart (lokal, von 0) --------------------------------------------
.PHONY: setup
setup: install env db-up db-wait migrate seed-all ## Komplettes lokales Setup von 0
	@echo ""
	@echo "✓ Setup fertig. Login-Admin via 'make seed-auth' angelegt. Weiter mit: make dev"

# --- Deployment (externes Traefik; braucht Docker) -----------------------
# Externes Netz muss existieren:  docker network create frontend
.PHONY: build up up-core down logs ps deploy deploy-core migrate-stack data config
build: ## App-Image bauen (Next.js standalone, non-root)
	$(COMPOSE) build app

up: ## Stack starten (App + Postgres + Geo) hinter Traefik
	$(COMPOSE) up -d

up-core: ## Nur App + Postgres starten (OHNE Geo/OSRM/Nominatim) — wenig RAM nötig
	$(COMPOSE) up -d --build app postgres

down: ## Stack stoppen
	$(COMPOSE) down

logs: ## App-Logs folgen
	$(COMPOSE) logs -f app

ps: ## Status der Stack-Container
	$(COMPOSE) ps

deploy: build up ## build + up (voller Stack inkl. Geo; migrate via Entrypoint)

deploy-core: ## build + up-core (App + Postgres, ohne Geo; Geo später per 'make data' + 'make up')
	$(MAKE) up-core

migrate-stack: ## Migrationen im laufenden App-Container ausführen (manuell)
	$(COMPOSE) exec app node docker/migrate.mjs

data: ## OSRM-Geodaten vorbereiten (Download + Preprocessing; viel RAM/Disk)
	./scripts/prepare-osm-data.sh

config: ## Compose-Konfiguration validieren
	$(COMPOSE) config --services
