# ============================================================
#  quic_ecs_dt — top-level Makefile
#  Targets:
#    make demo               — one-shot: certs → build → VM+Grafana →
#                              substrate → simulator (Ctrl-C cleans up)
#    make render             — build the paper PDF
#    make preview            — live-reload preview in browser
#    make build              — cargo build --release (native)
#    make build-cm5          — cargo build --release (aarch64 cross)
#    make monitoring-up      — start VictoriaMetrics + Grafana (docker)
#    make monitoring-down    — stop them
#    make monitoring-logs    — tail the monitoring stack
#    make clean              — remove generated outputs
# ============================================================

.PHONY: render preview build build-cm5 clean certs monitoring-up monitoring-down monitoring-logs demo

VENV        := $(HOME)/.venv/quic_ecs
PYTHON      := $(VENV)/bin/python
CM5_HOST    ?= 192.168.1.x
CM5_USER    ?= pi
CM5_BIN_DIR ?= /home/pi/quic_ecs_dt

# Self-signed dev TLS for the QUIC server (regenerate with `make certs`).
# SAN covers loopback, ::1, and cm5.local for the two-machine setup.
CERT_DIR  := certs
CERT_FILE := $(CERT_DIR)/server.crt
KEY_FILE  := $(CERT_DIR)/server.key

certs: $(CERT_FILE)

$(CERT_FILE):
	mkdir -p $(CERT_DIR)
	openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
	    -keyout $(KEY_FILE) -out $(CERT_FILE) \
	    -days 3650 -nodes \
	    -subj "/CN=localhost/O=quic_ecs_dt-dev/OU=substrate" \
	    -addext "subjectAltName=DNS:localhost,DNS:cm5.local,IP:127.0.0.1,IP:::1"

# Paper
render:
	cd paper && quarto render index.qmd

preview:
	cd paper && quarto preview index.qmd --port 4848 --no-browser

# Rust build (depends on dev cert so `cargo run` boots out of the box)
build: $(CERT_FILE)
	cargo build --release

build-cm5: $(CERT_FILE)
	CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
	cargo build --release --target aarch64-unknown-linux-gnu

# Deploy binary to CM5
deploy-cm5: build-cm5
	ssh $(CM5_USER)@$(CM5_HOST) "mkdir -p $(CM5_BIN_DIR)"
	scp target/aarch64-unknown-linux-gnu/release/quic_ecs_dt \
	    $(CM5_USER)@$(CM5_HOST):$(CM5_BIN_DIR)/

# One-shot demo runner — see scripts/demo.sh
demo:
	@./scripts/demo.sh

# Monitoring (VictoriaMetrics + Grafana, auto-provisioned)
monitoring-up:
	docker compose -f monitoring/docker-compose.yml up -d
	@echo ""
	@echo "Grafana: http://localhost:3000   (admin / admin, or anonymous Admin)"
	@echo "  • runtime dashboard:  quic_ecs_dt → quic_ecs_dt — substrate runtime"
	@echo "  • sensors dashboard:  quic_ecs_dt → quic_ecs_dt — sensors"
	@echo "VictoriaMetrics: http://localhost:8428"

monitoring-down:
	docker compose -f monitoring/docker-compose.yml down

monitoring-logs:
	docker compose -f monitoring/docker-compose.yml logs -f

# Clean
clean:
	cargo clean
	rm -rf paper/_output paper/.quarto paper/index.tex \
	       paper/figures/*.pdf paper/figures/*.png \
	       data/loopback/*.csv data/two_machine/*.csv