MODULE := git.binarycollective.de/binary/binary-transfer-cli
BINARY := btx
VERSION ?= dev
LDFLAGS := -s -w -X git.binarycollective.de/binary/binary-transfer-cli/internal/cli.version=$(VERSION)

PROTOC_VERSION ?= 35.1
PROTOC_GEN_GO_VERSION ?= v1.36.11
PROTOC_GEN_GO_GRPC_VERSION ?= v1.6.2

GOOS_LIST ?= linux darwin windows
GOARCH_LIST ?= amd64 arm64

.PHONY: all build install generate tidy test lint clean cross modzip

all: generate tidy build

build:
	go build -ldflags "$(LDFLAGS)" -o $(BINARY) ./cmd/btx

install:
	go install -ldflags "$(LDFLAGS)" ./cmd/btx

generate:
	@command -v protoc >/dev/null || (echo "protoc required (version $(PROTOC_VERSION))"; exit 1)
	@protoc_ver=$$(protoc --version | awk '{print $$2}'); \
	if [ "$$protoc_ver" != "$(PROTOC_VERSION)" ]; then \
		echo "protoc $(PROTOC_VERSION) required, got $$protoc_ver"; \
		exit 1; \
	fi
	@export PATH="$$(go env GOPATH)/bin:$$PATH"; \
	command -v protoc-gen-go >/dev/null || (echo "protoc-gen-go required: go install google.golang.org/protobuf/cmd/protoc-gen-go@$(PROTOC_GEN_GO_VERSION)"; exit 1); \
	command -v protoc-gen-go-grpc >/dev/null || (echo "protoc-gen-go-grpc required: go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@$(PROTOC_GEN_GO_GRPC_VERSION)"; exit 1); \
	protoc -I api/proto \
		--go_out=gen --go_opt=paths=source_relative \
		--go-grpc_out=gen --go-grpc_opt=paths=source_relative \
		api/proto/common/v1/common.proto \
		api/proto/project/v1/project.proto \
		api/proto/transfer/v1/transfer.proto

tidy:
	go mod tidy

test:
	go test ./...

lint:
	go vet ./...

clean:
	rm -rf $(BINARY) dist/

cross: tidy
	@mkdir -p dist
	@for goos in $(GOOS_LIST); do \
		for goarch in $(GOARCH_LIST); do \
			if [ "$$goos" = "darwin" ] && [ "$$goarch" = "amd64" ]; then continue; fi; \
			out=dist/$(BINARY)-$$goos-$$goarch; \
			if [ "$$goos" = "windows" ]; then out=$$out.exe; fi; \
			echo "building $$out"; \
			GOOS=$$goos GOARCH=$$goarch CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o $$out ./cmd/btx; \
		done; \
	done

modzip:
	@test -n "$(VERSION)" || (echo "VERSION required, e.g. make modzip VERSION=v0.1.0"; exit 1)
	@mkdir -p dist
	@tmp=$$(mktemp /tmp/binary-transfer-cli.XXXXXX.zip); \
	go run ./scripts/modzip "$(VERSION)" "$$tmp"; \
	mv "$$tmp" "dist/binary-transfer-cli@$(VERSION).zip"
