# whitepaper/gumyum/Makefile
# Targets: benchmarks, dot→SVG, donut charts, PDF
#
# Usage:
#   make bench-javac          — javac before/after (all 5 defects)
#   make bench-mc-server      — minecraft DependencySorter + BenchMax
#   make bench-max            — extreme-scale BenchMax (all 3 ecosystems)
#   make bench-all            — all benchmarks
#   make dots                 — render all .dot → SVG
#   make donuts               — generate donut chart SVGs
#   make visuals              — dots + donuts
#   make pdf                  — render gumyum PDF
#   make all                  — visuals + pdf
#   make clean                — remove generated SVGs and PDF

JAVA        := /tmp/jdk25/bin/java
JAVAC       := /tmp/jdk25/bin/javac
GUAVA       := /tmp/guava.jar
TESTS       := ../../tests
BENCH_OUT   := bench-results
PANDOC      := pandoc
DOT         := dot
PYTHON      := python3

DOTS_SRC    := $(wildcard dots/*.dot)
DOTS_SVG    := $(patsubst dots/%.dot,svg/%.svg,$(DOTS_SRC))

DONUT_SVGs  := svg/donut-javac.svg svg/donut-mc-server.svg svg/donut-mc-client.svg

MD          := gumyum-minecraft-enterprize-java-edition.md
PDF         := gumyum-minecraft-enterprize-java-edition.pdf
CSS         := gumyum-style.css

.PHONY: all bench-javac bench-mc-server bench-max bench-all \
        dots donuts visuals pdf clean

# ── Default ───────────────────────────────────────────────────────────────────
all: visuals pdf

# ── Benchmarks ───────────────────────────────────────────────────────────────

$(BENCH_OUT):
	mkdir -p $(BENCH_OUT)

# javac: all five defects — AllDefectsBenchmark + BeforeAfterBenchmark
bench-javac: $(BENCH_OUT)
	@echo "=== Compiling javac benchmarks ==="
	cd $(TESTS) && \
	$(JAVA) -m jdk.compiler/com.sun.tools.javac.Main \
	  --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
	  support/AbstractTestNode.java support/TarjanAlgorithm.java \
	  support/FindNodeAlgorithm.java support/ClosureAlgorithm.java \
	  support/TopoSorterAlgorithm.java support/DependencyListAlgorithm.java \
	  support/BoundSetAlgorithm.java support/GraphFactory.java \
	  bench/AllDefectsBenchmark.java bench/BeforeAfterBenchmark.java
	@echo "=== AllDefectsBenchmark (0001–0005) ==="
	cd $(TESTS) && \
	$(JAVA) --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
	  -cp . bench.AllDefectsBenchmark 2>&1 | tee $(CURDIR)/$(BENCH_OUT)/javac-all-defects.txt
	@echo "=== BeforeAfterBenchmark (Tarjan V=10..800) ==="
	cd $(TESTS) && \
	$(JAVA) --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
	  -cp . bench.BeforeAfterBenchmark 2>&1 | tee $(CURDIR)/$(BENCH_OUT)/javac-tarjan-before-after.txt
	@echo "Results: $(BENCH_OUT)/javac-*.txt"

# minecraft server: DependencySorter depth scaling
bench-mc-server: $(BENCH_OUT)
	@echo "=== Compiling minecraft benchmarks ==="
	$(JAVAC) --release 21 -cp $(GUAVA) \
	  $(TESTS)/bench/DependencySorterBenchmark.java \
	  -d $(TESTS)/bench/
	@echo "=== DependencySorterBenchmark (depth 2–16) ==="
	$(JAVA) -cp $(TESTS)/bench:$(GUAVA) bench.DependencySorterBenchmark 2>&1 \
	  | tee $(BENCH_OUT)/mc-server-dependency-sorter.txt
	@echo "Results: $(BENCH_OUT)/mc-server-dependency-sorter.txt"

# BenchMax: extreme scale — javac V→3200, MC diamond D→18, Create BFS V→5000
bench-max: $(BENCH_OUT)
	@echo "=== Compiling BenchMax ==="
	$(JAVAC) --release 21 -cp $(GUAVA) \
	  $(TESTS)/bench/BenchMax.java \
	  -d $(TESTS)/bench/
	@echo "=== BenchMax (extreme scale) ==="
	$(JAVA) -cp $(TESTS)/bench:$(GUAVA) bench.BenchMax 2>&1 \
	  | tee $(BENCH_OUT)/benchmax.txt
	@echo "Results: $(BENCH_OUT)/benchmax.txt"

# All benchmarks
bench-all: bench-javac bench-mc-server bench-max
	@echo "=== All benchmarks complete. Results in $(BENCH_OUT)/ ==="
	@ls -lh $(BENCH_OUT)/

# ── Dot → SVG ─────────────────────────────────────────────────────────────────

svg/%.svg: dots/%.dot
	@mkdir -p svg
	$(DOT) -Tsvg $< -o $@
	@echo "  rendered $<  →  $@"

dots: $(DOTS_SVG)
	@echo "=== All dot files rendered ==="

# ── Donut charts ──────────────────────────────────────────────────────────────

$(DONUT_SVGs): gen-donuts.py
	@mkdir -p svg
	$(PYTHON) gen-donuts.py

donuts: $(DONUT_SVGs)
	@echo "=== Donut charts generated ==="

# ── Visuals ───────────────────────────────────────────────────────────────────

visuals: dots donuts
	@echo "=== All visuals ready in svg/ ==="
	@ls -1 svg/

# ── PDF ───────────────────────────────────────────────────────────────────────

$(PDF): $(MD) $(CSS) $(DOTS_SVG) $(DONUT_SVGs)
	$(PANDOC) $(MD) \
	  --pdf-engine=wkhtmltopdf \
	  --css=$(CSS) \
	  --resource-path=. \
	  -V margin-top=0mm \
	  -V margin-bottom=12mm \
	  -V margin-left=0mm \
	  -V margin-right=0mm \
	  -o $(PDF)
	@echo "=== PDF rendered: $(PDF) ($$(du -h $(PDF) | cut -f1)) ==="

pdf: $(PDF)

# ── Clean ─────────────────────────────────────────────────────────────────────

clean:
	rm -f svg/*.svg $(PDF)
	rm -rf $(BENCH_OUT)
	@echo "=== Cleaned ==="
