IMG ?= dataplane-exporter:local
ARCH ?= $(shell go env GOARCH)
MAKEFILE_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
LOCAL_BIN := $(MAKEFILE_DIR)/bin
GOLANGCI_LINT_VERSION ?= v2.12.2
GOLANGCI_LINT_BIN := $(LOCAL_BIN)/golangci-lint

.PHONY: build build-linux docker-build install-lint lint lint-fix test

install-lint:
	@echo "Checking for golangci-lint..."
	@CURRENT_GO_VERSION=$$(go env GOVERSION); \
	INSTALLED_VERSION=""; \
	INSTALLED_GO_VERSION=""; \
	if [ -x "$(GOLANGCI_LINT_BIN)" ]; then \
		INSTALLED_VERSION=$$($(GOLANGCI_LINT_BIN) version 2>/dev/null | awk '/version / {print "v" $$4}'); \
		INSTALLED_GO_VERSION=$$($(GOLANGCI_LINT_BIN) version 2>/dev/null | sed -n 's/.*built with \(go[0-9.]*\).*/\1/p'); \
	fi; \
	if [ ! -x "$(GOLANGCI_LINT_BIN)" ] || [ "$$INSTALLED_VERSION" != "$(GOLANGCI_LINT_VERSION)" ] || [ "$$INSTALLED_GO_VERSION" != "$$CURRENT_GO_VERSION" ]; then \
		echo "Installing golangci-lint $(GOLANGCI_LINT_VERSION) to $(LOCAL_BIN)..."; \
		GOBIN=$(LOCAL_BIN) go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION); \
	else \
		echo "golangci-lint $(GOLANGCI_LINT_VERSION) already installed at $(GOLANGCI_LINT_BIN) with $$CURRENT_GO_VERSION"; \
	fi

build:
	CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/dataplane-exporter ./cmd/exporter

build-linux:
	CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -ldflags="-s -w" -o bin/dataplane-exporter-linux ./cmd/exporter

docker-build: build-linux
	docker build -t $(IMG) .

lint: install-lint
	$(GOLANGCI_LINT_BIN) run ./... --config $(MAKEFILE_DIR)/.golangci.yml --timeout 10m

lint-fix: install-lint
	$(GOLANGCI_LINT_BIN) run ./... --config $(MAKEFILE_DIR)/.golangci.yml --fix --timeout 10m

test:
	go test ./...
