# banjo-tts build. Usage:
#   make extract ROM="/path/to/Banjo-Kazooie (U).z64"   (US 1.0; .z64/.v64/.n64 all accepted)
#   make check                                          (validate the pack against the C header)
#   make bkvsay                                         (CLI: render text to a WAV)
#   make web                                            (wasm + static site in out/site)
#   make serve                                          (serve out/site on http://localhost:8000)
#   make webcheck                                       (wasm == native; real worklet in headless Chromium)
#   make dist                                           (source zip from git HEAD, next to the site)
#   make dist INCLUDE_PACK=1                            (...plus out/bkvoice.pack: ROM-derived, keep private)

ROM    ?=
OUT    ?= out
PYTHON ?= python3
CC     ?= cc
CFLAGS ?= -std=c99 -Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wno-sign-conversion -O2

CORE_SRC := $(wildcard core/src/*.c)
CORE_HDR := $(wildcard core/include/*.h core/src/*.h)

WASM_CC     ?= clang
WASM_CFLAGS := --target=wasm32 -O2 -mbulk-memory -fno-builtin -ffreestanding -nostdlib \
               -DBKV_FREESTANDING -Wall -Wextra -Icore/include
WASM_LDFLAGS := -Wl,--no-entry -Wl,--initial-memory=4194304 -Wl,--strip-debug
SITE := $(OUT)/site
PORT ?= 8000

.PHONY: extract check bkvsay wasm web serve webcheck dist clean

extract:
	@test -n "$(ROM)" || { echo 'usage: make extract ROM="path/to/rom.z64"'; exit 1; }
	$(PYTHON) -I tools/extract/extract.py "$(ROM)" --out $(OUT)

$(OUT)/packcheck: tools/packcheck/packcheck.c core/include/bkv_pack.h
	@mkdir -p $(OUT)
	$(CC) $(CFLAGS) -Icore/include -o $@ $<

check: $(OUT)/packcheck
	$(OUT)/packcheck $(OUT)/bkvoice.pack

bkvsay: $(OUT)/bkvsay

$(OUT)/bkvsay: tools/bkvsay/bkvsay.c $(CORE_SRC) $(CORE_HDR)
	@mkdir -p $(OUT)
	$(CC) $(CFLAGS) -Icore/include -o $@ tools/bkvsay/bkvsay.c $(CORE_SRC) -lm

wasm: $(OUT)/bkv.wasm

$(OUT)/bkv.wasm: web/wasm/bkv_wasm.c web/wasm/shim.c $(CORE_SRC) $(CORE_HDR)
	@mkdir -p $(OUT)
	$(WASM_CC) $(WASM_CFLAGS) $(WASM_LDFLAGS) -o $@ web/wasm/bkv_wasm.c web/wasm/shim.c $(CORE_SRC)

web: $(OUT)/bkv.wasm
	@test -f $(OUT)/bkvoice.pack || { echo 'run make extract first'; exit 1; }
	@mkdir -p $(SITE)/assets
	cp web/*.html web/*.js web/*.css $(SITE)/
	cp $(OUT)/bkv.wasm $(SITE)/
	cp $(OUT)/bkvoice.pack $(SITE)/assets/
	rm -rf $(SITE)/assets/portraits && cp -r $(OUT)/web/portraits $(SITE)/assets/
	cp $(OUT)/web/portraits.json $(SITE)/assets/
	cp tools/webcheck/offline.html $(SITE)/test.html

serve: web
	cd $(SITE) && $(PYTHON) -m http.server $(PORT) --bind 127.0.0.1

WEBCHECK_PORT ?= 8799
OK_EXPR := (() => { try { return JSON.parse(document.getElementById("out").textContent).ok } catch { return false } })()

webcheck: web bkvsay
	node tools/webcheck/compare.mjs
	@cd $(SITE) && { $(PYTHON) -m http.server $(WEBCHECK_PORT) --bind 127.0.0.1 >/dev/null 2>&1 & echo $$! > ../.webcheck.pid; }
	@sleep 1
	@node tools/webcheck/browser.mjs http://127.0.0.1:$(WEBCHECK_PORT)/test.html '$(OK_EXPR)' 40000; \
	  status=$$?; kill `cat $(OUT)/.webcheck.pid`; rm -f $(OUT)/.webcheck.pid; exit $$status

# Source zip for the site's download link. Archives the committed tree (HEAD), so
# extracted assets and ROMs (git-ignored) can't end up in it unless INCLUDE_PACK=1.
DIST_ZIP     ?= $(SITE)/banjo-voice-src.zip
INCLUDE_PACK ?= 0

define PACK_WARNING
@echo '' >&2
@echo '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' >&2
@echo '!!  WARNING: INCLUDE_PACK=1 - the zip contains out/bkvoice.pack.       !!' >&2
@echo '!!  That is game audio and data extracted from your ROM, copyright     !!' >&2
@echo '!!  Rare / Nintendo. Do NOT publish this zip or link it from a public  !!' >&2
@echo '!!  site. Rebuild without INCLUDE_PACK=1 for distribution.             !!' >&2
@echo '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' >&2
@echo '' >&2
endef

dist:
	@mkdir -p $(dir $(DIST_ZIP))
	@test -z "`git status --porcelain`" || echo 'note: uncommitted changes are not included (archiving HEAD)'
	git archive --format=zip --prefix=banjo-voice/ -o $(DIST_ZIP) HEAD
ifeq ($(INCLUDE_PACK),1)
	@test -f $(OUT)/bkvoice.pack || { echo 'INCLUDE_PACK=1 but $(OUT)/bkvoice.pack is missing: run make extract'; rm -f $(DIST_ZIP); exit 1; }
	$(PACK_WARNING)
	$(PYTHON) -I -c 'import sys, zipfile; z = zipfile.ZipFile(sys.argv[1], "a", zipfile.ZIP_DEFLATED); z.write(sys.argv[2], "banjo-voice/out/bkvoice.pack"); z.close()' $(DIST_ZIP) $(OUT)/bkvoice.pack
	$(PACK_WARNING)
	@echo 'wrote $(DIST_ZIP) (WITH ROM-derived pack)'
else
	@echo 'wrote $(DIST_ZIP) (source only, no game data)'
endif

clean:
	rm -rf $(OUT)
