.PHONY: lint test install clean

# Lua 5.1 lint + runtime test pipeline
# Run: make lint test

LUA_FILES := $(shell find src tests -name '*.lua' 2>/dev/null)
TEST_FILES := $(shell ls tests/*.lua 2>/dev/null | grep -v test_smoke)
LUA51 := lua5.1
LUAC51 := luac5.1
LINT_SCRIPT := $(shell find /root/.openclaw/workspace/skills/lua51-openwrt-lint/scripts -name 'lint.py' 2>/dev/null | head -1)
TESTBED_SCRIPTS := $(shell find /root/.openclaw/workspace/skills/openwrt-testbed/scripts -name '*.sh' 2>/dev/null)
TESTBED := $(shell echo "$$(dirname $$(dirname $(TESTBED_SCRIPTS)))" 2>/dev/null)

# ------------------------------------------------------------------
# Lint — parse check + feature scan (fast, no Docker)
# ------------------------------------------------------------------
lint:
	@echo "=== Lua 5.1 / OpenWrt Lint ==="
	@for f in $(LUA_FILES); do \
		echo -n "  $$f ... "; \
		if $(LUAC51) -p "$$f" >/dev/null 2>&1; then \
			echo "OK"; \
		else \
			echo "FAIL"; \
			$(LUAC51) -p "$$f"; \
			exit 1; \
		fi; \
	done
	@echo "  parse: all OK"
	@echo ""
	@echo "=== forbidden feature scan (comments stripped) ==="
	@bad=0; \
	for f in $(LUA_FILES); do \
		stripped=$$(perl -0777 -pe 's{--\[\[[^\]]*\]\]}{}g; s{--[^\n]*}{}g' "$$f"); \
		hits=$$(echo "$$stripped" | grep -nE '\bgoto\b|::[A-Za-z_]+::|<close>|utf8\.|table\.(move|pack|unpack)\b|string\.(pack|unpack|dump)\b' | head -5); \
		if [ -n "$$hits" ]; then echo "  $$f:"; echo "$$hits" | sed 's/^/    /'; bad=1; fi; \
	done; \
	if [ $$bad -eq 0 ]; then echo "  features: clean"; else exit 1; fi
	@echo ""
	@echo "lint: OK"

# ------------------------------------------------------------------
# Test on OpenWrt 19.07.7 testbed (Docker, ~2-5s overhead)
# ------------------------------------------------------------------
TEST_FILE ?= tests/smoke.lua

test:
	@echo "=== OpenWrt Testbed runtime check ==="
	@if [ ! -x "$(TESTBED_SCRIPTS)/test.sh" ]; then \
		echo "testbed not found — skipping runtime tests"; \
		echo "(install openwrt-testbed skill first)"; \
		exit 0; \
	fi
	@echo "using testbed: $(TESTBED)"
	$(TESTBED_SCRIPTS)/test.sh $(TEST_FILE) --assert "OK" 2>&1 | tail -20
	@echo "=== done ==="

# ------------------------------------------------------------------
# Test a specific file
# ------------------------------------------------------------------
test-file:
	@$(TESTBED_SCRIPTS)/test.sh $(TEST_FILE) --assert "OK" 2>&1 | tail -20

# ------------------------------------------------------------------
# Unit tests (plain Lua, no Docker needed for logic-only tests)
# ------------------------------------------------------------------
unit:
	@echo "=== Unit tests (plain Lua) ==="
	@for t in $(TEST_FILES); do \
		echo "--- $$t ---"; \
		$(LUA51) $$t 2>&1 | tail -3 || exit 1; \
	done

# ------------------------------------------------------------------
# Install to local staging dir (for SDK packaging)
# ------------------------------------------------------------------
DESTDIR ?= /tmp/balancerlite-staging
PREFIX ?= /usr

install:
	install -d $(DESTDIR)$(PREFIX)/lib/lua/5.1/balancerlite/
	install -d $(DESTDIR)$(PREFIX)/bin/
	install -d $(DESTDIR)/etc/config/
	install -d $(DESTDIR)/etc/init.d/
	install -m 0644 src/balancerlite/*.lua $(DESTDIR)$(PREFIX)/lib/lua/5.1/balancerlite/
	install -m 0755 bin/balancerlite     $(DESTDIR)$(PREFIX)/bin/
	install -m 0755 bin/balancerlite-ctl $(DESTDIR)$(PREFIX)/bin/
	install -m 0644 etc/config/balancerlite $(DESTDIR)/etc/config/
	install -m 0755 etc/init.d/balancerlite  $(DESTDIR)/etc/init.d/
	@echo "installed to $(DESTDIR)"

clean:
	@echo "nothing to clean (no build artifacts)"

.PHONY: lint test unit install clean test-file
