GO        ?= go
MODULE    := spark-server
BIN       := bin/spark-server
LINUX_DIR := bin/linux_amd64
IMAGE     ?= spark-server:latest
LDFLAGS   := -s -w -buildid=
LINT      ?= golangci-lint
CONFIG    ?= configs/config.yaml
LOGIC_COVER_MIN ?= 65

.PHONY: all build image test lint fmt vet tidy migrate start run deploy

all: lint test build

build:
	$(GO) build -o $(BIN) ./cmd/server

# Cross-compile for ECS and pack a runtime-only amd64 image (no Go toolchain in the image).
image:
	@command -v docker >/dev/null || { echo "docker is required for make image" >&2; exit 1; }
	mkdir -p $(LINUX_DIR)
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -trimpath -ldflags="$(LDFLAGS)" -o $(LINUX_DIR)/spark-server ./cmd/server
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -trimpath -ldflags="$(LDFLAGS)" -o $(LINUX_DIR)/spark-migrate ./cmd/migrate
	docker build --platform linux/amd64 -t $(IMAGE) .

# All unit tests, then each module logic package must be >= LOGIC_COVER_MIN.
test:
	$(GO) test ./...
	@echo "==> logic Service coverage (>= $(LOGIC_COVER_MIN)%)"
	@covout=$$($(GO) test -cover ./internal/module/*/logic); \
	status=$$?; \
	printf '%s\n' "$$covout"; \
	if [ $$status -ne 0 ]; then exit $$status; fi; \
	printf '%s\n' "$$covout" | awk -v min=$(LOGIC_COVER_MIN) ' \
		BEGIN { bad=0 } \
		/\[no test files\]/ { printf "FAIL %s: no test files\n", $$2; bad=1; next } \
		{ \
			cov=""; \
			for (i = 1; i <= NF; i++) { \
				if ($$i == "coverage:") { cov=$$(i+1); break } \
			} \
			if (cov == "" || cov == "[no") next; \
			gsub("%", "", cov); \
			if (cov+0 < min+0) { printf "FAIL %s: coverage %s%% < %s%%\n", $$2, cov, min; bad=1 } \
		} \
		END { if (bad) exit 1 }'

vet:
	$(GO) vet ./...

fmt:
	$(GO) fmt ./...

lint:
	$(LINT) run ./...

tidy:
	$(GO) mod tidy

migrate:
	$(GO) run ./cmd/migrate -config $(CONFIG)

start:
	$(GO) run ./cmd/server -config $(CONFIG)

run: build
	./$(BIN) -config $(CONFIG)

deploy:
	bash deploy/docker/deploy.sh
