.PHONY: help up down logs build restart \
        backend-install backend-run backend-dev \
        backend-register backend-login backend-trips \
        lint clean

# ── Default ───────────────────────────────────────────────────────────────────
help:
	@echo ""
	@echo "MyTrip — available targets"
	@echo ""
	@echo "  Full stack (Docker)"
	@echo "    make up          Build images and start all services"
	@echo "    make down        Stop and remove containers"
	@echo "    make build       Rebuild images without starting"
	@echo "    make build-nocache Rebuild images ignoring cache"
	@echo "    make logs        Tail logs for all services"
	@echo "    make restart     down + up"
	@echo ""
	@echo "  Load testing"
	@echo "    make loadtest        Run load test against Docker stack (hey)"
	@echo "    make loadtest-local  Run load test against local backend (hey)"
	@echo "    make loadtest-k6     Run k6 test against Docker stack"
	@echo "    make loadtest-k6-local Run k6 test against local backend"
	@echo ""
	@echo "  Backend (local console)"
	@echo "    make backend-install   Install dependencies via uv"
	@echo "    make backend-run       Run backend against a local MongoDB"
	@echo "    make backend-dev       Run backend with hot-reload"
	@echo "    make backend-register  Register a test user (USERNAME/PASSWORD vars)"
	@echo "    make backend-login     Log in and print JWT (USERNAME/PASSWORD vars)"
	@echo "    make backend-trips     Fetch trips using stored token (ORIGIN/DEST vars)"
	@echo ""
	@echo "  Variables (set via env or make command)"
	@echo "    REQUESTS=200 CONCURRENCY=20 USERNAME=alice PASSWORD=secret"
	@echo "    ORIGIN=\"Zürich\" DEST=\"Bern\" BACKEND_URL=http://localhost:8000"
	@echo ""

# ── Full stack ────────────────────────────────────────────────────────────────
up:
	@[ -f .env ] || { echo "ERROR: .env not found. Run: cp .env.example .env"; exit 1; }
	docker compose up --build

down:
	docker compose down

build:
	docker compose build

# rebuild images from scratch (ignore cache)
build-nocache:
	docker compose build --no-cache

logs:
	docker compose logs -f

restart: down up

# ── Backend — local console ───────────────────────────────────────────────────
BACKEND_DIR := backend
BACKEND_URL ?= http://localhost:80
MONGO_URL   ?= mongodb://localhost:27017/tripdb
USERNAME    ?= admin
PASSWORD    ?= admin123
ORIGIN      ?= 8503308
DEST        ?= 8503424

# Token file written by backend-login, consumed by backend-trips
TOKEN_FILE := /tmp/mytrip_token

backend-install:
	cd $(BACKEND_DIR) && uv sync

backend-run:
	cd $(BACKEND_DIR) && \
	  MONGO_URL=$(MONGO_URL) uv run uvicorn main:app --host 0.0.0.0 --port 8000

backend-dev:
	cd $(BACKEND_DIR) && \
	  MONGO_URL=$(MONGO_URL) uv run uvicorn main:app --host 0.0.0.0 --port 8000 --reload

backend-register:
	curl -s -X POST $(BACKEND_URL)/api/auth/register \
	  -H "Content-Type: application/json" \
	  -d '{"username":"$(USERNAME)","password":"$(PASSWORD)"}' | jq .

backend-login:
	@curl -s -X POST $(BACKEND_URL)/api/auth/login \
	  -H "Content-Type: application/json" \
	  -d '{"username":"$(USERNAME)","password":"$(PASSWORD)"}' \
	| tee /dev/stderr \
	| jq -r '.access_token // empty' > $(TOKEN_FILE)
	@echo ""
	@echo "Token saved to $(TOKEN_FILE)"

backend-trips:
	@[ -f $(TOKEN_FILE) ] || { echo "ERROR: run 'make backend-login' first"; exit 1; }
	curl -s "$(BACKEND_URL)/api/trips?origin=$(ORIGIN)&destination=$(DEST)" \
	  -H "Authorization: Bearer $$(cat $(TOKEN_FILE))" | jq .


# ── Misc ──────────────────────────────────────────────────────────────────────
lint:
	cd $(BACKEND_DIR) && uv run ruff check .

clean:
	docker compose down -v --remove-orphans
	find . -type d -name __pycache__ -exec rm -rf {} +
	find . -name "*.pyc" -delete
	rm -f $(TOKEN_FILE)

# ── Load testing ──────────────────────────────────────────────────────────────
REQUESTS     ?= 200
CONCURRENCY  ?= 20

# Defaults for Docker setup (Traefik on port 80)
LOADTEST_BACKEND_URL ?= http://localhost
LOADTEST_USERNAME    ?= admin
LOADTEST_PASSWORD    ?= admin123
LOADTEST_ORIGIN      ?= Zürich
LOADTEST_DEST        ?= Bern

loadtest:
	@echo "Running load test: $(REQUESTS) requests, $(CONCURRENCY) concurrent"
	@echo "URL: $(LOADTEST_BACKEND_URL), User: $(LOADTEST_USERNAME), Route: $(LOADTEST_ORIGIN) → $(LOADTEST_DEST)"
	@TOKEN=$$(curl -s -X POST $(LOADTEST_BACKEND_URL)/api/auth/login \
	  -H 'Content-Type: application/json' \
	  -d '{"username":"$(LOADTEST_USERNAME)","password":"$(LOADTEST_PASSWORD)"}' | jq -r '.access_token // empty'); \
	if [ -z "$$TOKEN" ]; then echo "ERROR: Failed to get token"; exit 1; fi; \
	hey -n $(REQUESTS) -c $(CONCURRENCY) -H "Authorization: Bearer $$TOKEN" \
	  "$(LOADTEST_BACKEND_URL)/api/trips?origin=$(LOADTEST_ORIGIN)&destination=$(LOADTEST_DEST)"

loadtest-local:
	@echo "Running load test against local backend: $(REQUESTS) requests, $(CONCURRENCY) concurrent"
	@echo "URL: $(BACKEND_URL), User: $(USERNAME), Route: $(ORIGIN) → $(DEST)"
	@TOKEN=$$(curl -s -X POST $(BACKEND_URL)/api/auth/login \
	  -H 'Content-Type: application/json' \
	  -d '{"username":"$(USERNAME)","password":"$(PASSWORD)"}' | jq -r '.access_token // empty'); \
	if [ -z "$$TOKEN" ]; then echo "ERROR: Failed to get token"; exit 1; fi; \
	hey -n $(REQUESTS) -c $(CONCURRENCY) -H "Authorization: Bearer $$TOKEN" \
	  "$(BACKEND_URL)/api/trips?origin=$(ORIGIN)&destination=$(DEST)"

loadtest-k6:
	@echo "Running k6 load test: $(REQUESTS) requests, $(CONCURRENCY) concurrent"
	@docker run --rm -i --network host \
	  -e BACKEND_URL=$(LOADTEST_BACKEND_URL) \
	  -e USERNAME=$(LOADTEST_USERNAME) \
	  -e PASSWORD=$(LOADTEST_PASSWORD) \
	  -e ORIGIN=$(LOADTEST_ORIGIN) \
	  -e DEST=$(LOADTEST_DEST) \
	  -e REQUESTS=$(REQUESTS) \
	  -e CONCURRENCY=$(CONCURRENCY) \
	  -v $(PWD)/k6:/scripts \
	  grafana/k6 run --vus $(CONCURRENCY) --iterations $(REQUESTS) /scripts/script.js

loadtest-k6-local:
	@echo "Running k6 load test against local backend: $(REQUESTS) requests, $(CONCURRENCY) concurrent"
	@docker run --rm -i --network host \
	  -e BACKEND_URL=$(BACKEND_URL) \
	  -e USERNAME=$(USERNAME) \
	  -e PASSWORD=$(PASSWORD) \
	  -e ORIGIN=$(ORIGIN) \
	  -e DEST=$(DEST) \
	  -e REQUESTS=$(REQUESTS) \
	  -e CONCURRENCY=$(CONCURRENCY) \
	  -v $(PWD)/k6:/scripts \
	  grafana/k6 run --vus $(CONCURRENCY) --iterations $(REQUESTS) /scripts/script.js
