.PHONY: all build test gui gui-dev gui-dist gui-deb gui-win gui-win-docker help clean

# ModelRouter - single-binary gateway + optional Electron desktop GUI (embedded core)
export BINARY
BINARY=llmsproxy
export BUILD_DIR
BUILD_DIR=build
export GUI_DIR
GUI_DIR=cmd/gui
VERSION ?= $(shell git describe --tags --dirty 2>/dev/null || echo "0.1.0")

# Clean env for GUI packaging: the host may have LD_LIBRARY_PATH polluted by
# third-party runtimes (e.g. /opt/cangjie) which electron-builder bakes into
# the produced binary's DT_RPATH/dep resolution -> the packaged app then
# SIGSEGVs inside ld.so on clean machines.  Strip it for every pack step.
CLEAN_PACK_ENV = env -u LD_LIBRARY_PATH

all: build

# ---- core binary (server users / embedded core) ----
build:
	@mkdir -p $(BUILD_DIR)
	CGO_ENABLED=1 go build -tags luajit -trimpath -o $(BUILD_DIR)/$(BINARY) ./cmd/llmsproxy
	@echo "Built: $(BUILD_DIR)/$(BINARY) ($(VERSION))"

# ---- core distribution packages (deb + rpm + tar.gz) -----
# Server admins install these with dpkg/rpm; unlike the GUI they are the bare
# gateway binary + systemd unit (with memory tuning) + Lua adapters.
core-dist:
	./packaging/core-dist.sh $(VERSION)

.PHONY: core-dist

# ---- GUI (Electron) ----
gui:
	@cd $(GUI_DIR) && npm start

gui-dev:
	@cd $(GUI_DIR) && npm run dev

# build the embedded core into the GUI, then run electron-builder
# targets: deb + rpm + AppImage (linux); rpm needs system rpmbuild
# NOTE: run in a clean env (no LD_LIBRARY_PATH pollution) so the packaged
# binary does not link against host-only libs and crash on user machines.
gui-dist:
	@cd $(GUI_DIR) && $(CLEAN_PACK_ENV) npm run dist:linux
	./packaging/verify-dist.sh

# deb only (for local sharing), rpm needs rpmbuild
gui-deb:
	@cd $(GUI_DIR) && $(CLEAN_PACK_ENV) npm run dist:debian

# windows nsis installer: host-built core (needs apt install gcc-mingw-w64-x86-64 + wine)
gui-win:
	@cd $(GUI_DIR) && $(CLEAN_PACK_ENV) npm run dist:win

# windows nsis installer: full cross-build in docker (self-sufficient, no host mingw)
gui-win-docker:
	@cd $(GUI_DIR) && $(CLEAN_PACK_ENV) ./scripts/dist-win-docker.sh
	./packaging/verify-dist.sh

gui-dist-dir:
	@cd $(GUI_DIR) && $(CLEAN_PACK_ENV) npm run dist:dir

test:
	go test ./...

clean:
	rm -rf $(BUILD_DIR) cmd/build cmd/gui/dist cmd/gui/build/gui-dist cmd/gui/bin

help:
	@echo "Targets:"
	@echo "  make build      build core binary (luajit)"
	@echo "  make core-dist  build core packages: deb + rpm + tar.gz (needs nfpm)"
	@echo "  make gui        run desktop GUI (dev)"
	@echo "  make gui-dev    run GUI with devtools"
	@echo "  make gui-dist   build deb + rpm + AppImage (linux)"
	@echo "  make gui-deb    build deb only"
	@echo "  make gui-win    build Windows nsis (needs host mingw + wine)"
	@echo "  make gui-win-docker  build Windows nsis all-in-docker (no host mingw needed)"
	@echo "  make test       run go tests"
	@echo "  make clean      remove build dirs and packaged installers (build/, cmd/build/, cmd/gui/dist/)"
