# whitepaper/Makefile
# Generates both undefect. white papers with slug-named output PDFs and HTML.
#
#   make pdf-cwe407       — full CWE-407 cross-ecosystem report (PDF)
#   make pdf-minecraft    — gumyum: Minecraft + javac enterprise edition (PDF)
#   make html-cwe407      — full CWE-407 report (HTML)
#   make html-minecraft   — gumyum report (HTML)
#   make all              — all PDFs and HTML
#   make clean            — remove slug PDFs and HTML (leaves originals)
#
# Output slugs:
#   undefect-cwe407-$(DATE).pdf / .html
#   undefect-minecraft-enterprise-java-$(DATE).pdf / .html

DATE    := $(shell date +%Y-%m-%d)
PANDOC  := pandoc
DOT     := dot
PYTHON  := python3

SLUG_CWE407     := undefect-cwe407-$(DATE).pdf
SLUG_MINECRAFT  := undefect-minecraft-enterprise-java-$(DATE).pdf
HTML_CWE407     := undefect-cwe407-$(DATE).html
HTML_MINECRAFT  := undefect-minecraft-enterprise-java-$(DATE).html

# ── Outreach briefs ───────────────────────────────────────────────────────────
OUTREACH_DIR    := outreach
OUTREACH_CSS    := $(OUTREACH_DIR)/outreach-style.css
OUTREACH_HEADER := $(OUTREACH_DIR)/header-body.html
OUTREACH_BRIEFS := \
  javac typescript ghc scala3 scala rustc erlang-otp swipl go kotlin swift \
  gcc llvm v8 spidermonkey crystal julia lua perl5 php ruby r elixir nim \
  postgresql mongodb mysql mariadb redis valkey cockroachdb tidb clickhouse \
  duckdb elasticsearch opensearch solr \
  scylladb yugabyte foundationdb rocksdb leveldb lmdb cassandra ceph memcached \
  frrouting bird onos odl httpd nginx haproxy openvpn zeek curl libgit2 vlc \
  traefik caddy varnish ovs \
  tor solidity minecraft geth substrate \
  build-tools hive spark kafka flink pulsar nats \
  storm zookeeper nifi artemis activemq camel \
  hudi iceberg druid pinot trino starrocks doris kylin \
  spring micronaut quarkus tomcat jetty \
  django rails pyramid bottle fastapi sinatra hanami phoenix gin fiber \
  hibernate mybatis efcore sqlalchemy peewee sequelize typeorm doctrine \
  seaorm diesel gorm exposed \
  godot pygame sfml threejs angelscript dry tinkerpop \
  neo4j janusgraph dgraph \
  ogre bullet bevy libgdx allegro5 sdl2 sdl3 panda3d box2d \
  raylib love2d \
  kubernetes nomad consul envoy istio cilium linkerd2 containerd moby \
  terraform ansible saltstack cfengine puppet jenkins bazel buildkit luigi \
  helm opentofu pulumi podman \
  prometheus otel-collector grafana victoria-metrics \
  synapse dendrite element-web \
  weechat unrealircd jvb ejabberd asterisk simplex-chat rocketchat \
  mattermost jami postfix opensmtpd dovecot linphone freeswitch \
  numpy pandas sklearn pytorch-geometric \
  celery ray prefect airflow argo metaflow kubeflow optuna \
  wasmtime wasmer \
  ninja mesa meson spirv-cross \
  linux hadoop keystone \
  grpc tokio actix-web nestjs \
  rubocop solargraph networkx rabbitmq kicad octave \
  presto webpack thrift gradle pip cmake \
  openssl mbedtls wolfssl \
  ros2 opencv open3d vtk graphhopper valhalla \
  ffmpeg gstreamer \
  igraph nova neutron \
  jsc wireshark nmap \
  hbase
OUTREACH_PDFS   := $(patsubst %,$(OUTREACH_DIR)/pdf/%.pdf,$(OUTREACH_BRIEFS))
OUTREACH_MD5    := $(OUTREACH_DIR)/MD5SUMS

PANDOC_OUTREACH_FLAGS := \
  --pdf-engine=wkhtmltopdf \
  --css=$(OUTREACH_CSS) \
  --include-before-body=$(OUTREACH_HEADER) \
  --resource-path=$(OUTREACH_DIR) \
  -V margin-top=22mm -V margin-bottom=15mm \
  -V margin-left=20mm -V margin-right=20mm

$(OUTREACH_DIR)/pdf/%.pdf: $(OUTREACH_DIR)/%.md $(OUTREACH_CSS) $(OUTREACH_HEADER)
	@mkdir -p $(OUTREACH_DIR)/pdf
	$(PANDOC) $< $(PANDOC_OUTREACH_FLAGS) \
	  --metadata title="$(notdir $(basename $<)) — CWE-407 Disclosure Brief" \
	  -o $@
	@echo "==>  $@  ($$(du -h $@ | cut -f1))"

$(OUTREACH_MD5): $(OUTREACH_PDFS)
	cd $(OUTREACH_DIR)/pdf && md5sum *.pdf > ../MD5SUMS
	@echo "==> $(OUTREACH_MD5)"

pdf-outreach: $(OUTREACH_PDFS) $(OUTREACH_MD5)

.PHONY: all pdf-cwe407 pdf-minecraft html-cwe407 html-minecraft pdf-outreach visuals clean

all: html-cwe407 html-minecraft pdf-cwe407 pdf-minecraft pdf-outreach

# ── Full CWE-407 white paper ──────────────────────────────────────────────────
# Source: full-paper.md + pdf-style.css (ChunkFive embedded, no external deps)

$(SLUG_CWE407): full-paper.md pdf-style.css
	$(PANDOC) full-paper.md \
	  --pdf-engine=wkhtmltopdf \
	  --css=pdf-style.css \
	  --resource-path=. \
	  -V margin-top=20mm \
	  -V margin-bottom=20mm \
	  -V margin-left=20mm \
	  -V margin-right=20mm \
	  -o $(SLUG_CWE407)
	@echo "==> $(SLUG_CWE407)  ($$(du -h $(SLUG_CWE407) | cut -f1))"

pdf-cwe407: $(SLUG_CWE407)

# ── Minecraft enterprise java white paper ─────────────────────────────────────
# Source: gumyum/*.md + gumyum-style.css + svg/*.svg (dots + donuts)
# Visuals are rebuilt first if any .dot or gen-donuts.py changed.

GUMYUM_DIR  := gumyum
GUMYUM_MD   := $(GUMYUM_DIR)/gumyum-minecraft-enterprize-java-edition.md
GUMYUM_CSS  := $(GUMYUM_DIR)/gumyum-style.css
DOTS_SRC    := $(wildcard $(GUMYUM_DIR)/dots/*.dot)
DOTS_SVG    := $(patsubst $(GUMYUM_DIR)/dots/%.dot,$(GUMYUM_DIR)/svg/%.svg,$(DOTS_SRC))
DONUT_SVGS  := $(GUMYUM_DIR)/svg/donut-javac.svg \
               $(GUMYUM_DIR)/svg/donut-mc-server.svg \
               $(GUMYUM_DIR)/svg/donut-mc-client.svg

# Dot → SVG
$(GUMYUM_DIR)/svg/%.svg: $(GUMYUM_DIR)/dots/%.dot
	@mkdir -p $(GUMYUM_DIR)/svg
	$(DOT) -Tsvg $< -o $@

# Donut SVGs
$(DONUT_SVGS): $(GUMYUM_DIR)/gen-donuts.py
	@mkdir -p $(GUMYUM_DIR)/svg
	cd $(GUMYUM_DIR) && $(PYTHON) gen-donuts.py

visuals: $(DOTS_SVG) $(DONUT_SVGS)

$(SLUG_MINECRAFT): $(GUMYUM_MD) $(GUMYUM_CSS) $(DOTS_SVG) $(DONUT_SVGS)
	cd $(GUMYUM_DIR) && $(PANDOC) gumyum-minecraft-enterprize-java-edition.md \
	  --pdf-engine=wkhtmltopdf \
	  --css=gumyum-style.css \
	  --resource-path=. \
	  -V margin-top=0mm \
	  -V margin-bottom=20mm \
	  -V margin-left=20mm \
	  -V margin-right=20mm \
	  -o $(CURDIR)/$(SLUG_MINECRAFT)
	@echo "==> $(SLUG_MINECRAFT)  ($$(du -h $(SLUG_MINECRAFT) | cut -f1))"

pdf-minecraft: $(SLUG_MINECRAFT)

# ── HTML ──────────────────────────────────────────────────────────────────────

$(HTML_CWE407): full-paper.md pdf-style.css
	$(PANDOC) full-paper.md \
	  --standalone \
	  --css pdf-style.css \
	  --resource-path=. \
	  --metadata title="undefect. CWE-407: The Sedimentary Defect" \
	  -o $(HTML_CWE407)
	@echo "==> $(HTML_CWE407)  ($$(du -h $(HTML_CWE407) | cut -f1))"

html-cwe407: $(HTML_CWE407)

$(HTML_MINECRAFT): $(GUMYUM_MD) $(GUMYUM_CSS) $(DOTS_SVG) $(DONUT_SVGS)
	cd $(GUMYUM_DIR) && $(PANDOC) gumyum-minecraft-enterprize-java-edition.md \
	  --standalone \
	  --css gumyum-style.css \
	  --resource-path=. \
	  -o $(CURDIR)/$(HTML_MINECRAFT)
	@echo "==> $(HTML_MINECRAFT)  ($$(du -h $(HTML_MINECRAFT) | cut -f1))"

html-minecraft: visuals $(HTML_MINECRAFT)

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

clean:
	rm -f undefect-cwe407-*.pdf undefect-cwe407-*.html
	rm -f undefect-minecraft-enterprise-java-*.pdf undefect-minecraft-enterprise-java-*.html
	rm -f $(OUTREACH_DIR)/pdf/*.pdf $(OUTREACH_MD5)
	@echo "Cleaned slug PDFs and HTML."
