# ws_usernode Makefile —— build / test / dev 工作流
# 代理：容器构建无法继承 proxychains 注入，通过 --build-arg 显式传递
# 宿主机代理环境变量（HTTP_PROXY/HTTPS_PROXY/ALL_PROXY/NO_PROXY）。

# ---------- 代理参数（供 podman build 使用） ----------
HTTP_PROXY_ARG   := $(if $(HTTP_PROXY),--build-arg HTTP_PROXY=$(HTTP_PROXY),)
HTTPS_PROXY_ARG  := $(if $(HTTPS_PROXY),--build-arg HTTPS_PROXY=$(HTTPS_PROXY),)
ALL_PROXY_ARG    := $(if $(ALL_PROXY),--build-arg ALL_PROXY=$(ALL_PROXY),)
NO_PROXY_ARG     := $(if $(NO_PROXY),--build-arg NO_PROXY=$(NO_PROXY),)
PROXY_ARGS       := $(HTTP_PROXY_ARG) $(HTTPS_PROXY_ARG) $(ALL_PROXY_ARG) $(NO_PROXY_ARG)
NET_HOST         := --network=host

GO       ?= go
PODMAN   ?= podman
BIN      := bin/usernode
VERSION  ?= 0.3.0-m3
LDFLAGS  := -s -w -X main.version=$(VERSION)
GOFLAGS  := -trimpath

# ---------- 后端 ----------

.PHONY: build
build: ## 构建 Go 二进制（后端，不含前端产物）
	$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode

.PHONY: test
test: ## 运行全部 Go 测试
	$(GO) test ./...

.PHONY: vet
vet: ## 静态检查
	$(GO) vet ./...

.PHONY: run
run: build ## 本地运行（默认 config.toml，缺失则用默认配置）
	./$(BIN) serve

.PHONY: migrate
migrate: build ## 数据库迁移
	./$(BIN) migrate

# ---------- 前端 ----------

.PHONY: web-install
web-install: ## 容器内安装前端依赖（node:20-alpine），并初始化 node_modules volume
	$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
	$(PODMAN) run --rm $(NET_HOST) \
		-v ws_usernode_node_modules:/app/node_modules \
		ws-usernode-web-dev sh -c "ls node_modules >/dev/null && echo node_modules ready"

.PHONY: web-dev
web-dev: ## 前端 dev 容器（热开发，端口 5173；API 代理到 Go 后端）
	$(PODMAN) run --rm -p 5173:5173 \
		-v $(CURDIR)/web:/app \
		-v ws_usernode_node_modules:/app/node_modules \
		-e VITE_API_PROXY=http://host.containers.internal:8080 \
		ws-usernode-web-dev

.PHONY: web-build
web-build: ## 容器内构建前端产物到 web/dist，并复制到 internal/webui/dist（供 go:embed）
	$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
	$(PODMAN) run --rm $(NET_HOST) \
		-v $(CURDIR)/web:/app \
		-v ws_usernode_node_modules:/app/node_modules \
		-v $(CURDIR)/internal/webui/dist:/embed/dist \
		ws-usernode-web-dev sh -c "npm run build && cp -r dist/. /embed/dist/ && echo web-build ok"

# ---------- 镜像 / 分发 ----------

.PHONY: image
image: ## 构建单二进制容器镜像（deploy/Containerfile 多阶段）
	$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode:$(VERSION) -t ws-usernode:latest -f deploy/Containerfile .

.PHONY: build-embed
build-embed: web-build ## 构建含前端产物的 Go 二进制（web-build 后重新编译）
	$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode

.PHONY: dev
dev: ## 开发提示
	@echo "后端：make run  前端：make web-dev"
	@echo "或：go run ./cmd/usernode serve --debug"

.PHONY: clean
clean: ## 清理构建产物
	rm -rf bin web/dist

.PHONY: help
help: ## 显示帮助
	@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-14s\033[0m %s\n", $$1, $$2}'
