OUT_DIR = bin

GO = go
GO_PATH = $$($(GO) env GOPATH)
GO_BUILD = $(GO) build
GO_GET = $(GO) get
GO_INSTALL = $(GO) install
GO_TEST = $(GO) test
GO_LINT = $(GO_PATH)/bin/golangci-lint
PACKAGE_LIST  := go list ./...| grep -vE "test|docs|proto|core-portal|message|swagger|structs|fake|cmd|pkg/collector/config|pkg/common|pkg/constructor"
PACKAGES  ?= $$($(PACKAGE_LIST))
TEST_DIR := /tmp/observability

ifeq ($(shell uname -m),aarch64)
	ARCH=arm64
else
	ARCH=amd64
endif

.PHONY: build

data-processor:
	GO111MODULE=on  go build -ldflags="-s -w" -o bin/data-processor cmd/processor/main.go

data-collector:
	GO111MODULE=on  go build -ldflags="-s -w" -o bin/data-collector cmd/collector/main.go

mock:
	GOFLAGS=-mod=mod GO111MODULE=on go install github.com/golang/mock/mockgen
	mockgen -destination ./test/mockdataprocessor/mocks.go -package mock_data_processor -source ./pkg/processor/interface.go
	mockgen -destination ./test/mocks3/mock_s3.go -package mock_s3 -source ./pkg/collector/sinks/s3.go
	mockgen -destination ./test/mocksinks/mock_sink.go -package mock_sink -source ./pkg/collector/sinks/interface.go
	mockgen -destination ./test/mocksources/mock_source.go -package mock_source -source ./pkg/collector/sources/interface.go
lint: mock
	$(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
	golangci-lint run --fix -v $$($(LINT_PACKAGES)) --config .golangci.yml
	git diff --exit-code
	
add_test_file:
	./build/ci/add_test_file.sh

# don't run it locally, only for CI, use `make test` instead
ci_test: add_test_file  build mock
	go install github.com/axw/gocov/gocov@latest
	go install github.com/jstemmer/go-junit-report@latest
	go install github.com/AlekSi/gocov-xml@latest
	$(GO) install gotest.tools/gotestsum@latest
	@-(gotestsum --junitfile ./unit-tests.xml --packages=${PACKAGES})
	-go test -v ${PACKAGES} -coverprofile=cover.out
	gocov convert cover.out | gocov-xml > coverage.xml

test:  build lint
	mkdir -p "$(TEST_DIR)"
	$(GO) install gotest.tools/gotestsum@latest
	@-(gotestsum --junitfile "$(TEST_DIR)/unit-tests.xml" --packages=${PACKAGES})
	-go test -v ${PACKAGES} -coverprofile="$(TEST_DIR)/cover.out"
	go tool cover -html "$(TEST_DIR)/cover.out" -o "$(TEST_DIR)/cover.html"
	@echo "check ut results in $(TEST_DIR)/unit-tests.xml"
	@echo "check ut coverage by opening $(TEST_DIR)/cover.html using browser"

# don't run it locally, only for CI, use `make gosec` instead
ci_gosec:
	$(GO) install github.com/securego/gosec/v2/cmd/gosec@latest
	gosec -fmt=junit-xml -out=gosec-results.xml -stdout -verbose=text -exclude=G103,G104,G204,G304,G307,G401,G404,G501,G505,G601 ./...

gosec:
	mkdir -p "$(TEST_DIR)"
	$(GO) install github.com/securego/gosec/v2/cmd/gosec@latest
	gosec -fmt=junit-xml -out="$(TEST_DIR)/gosec-results.xml" -stdout -verbose=text -exclude=G103,G104,G204,G304,G307,G401,G404,G501,G505,G601 ./...
	echo "check gosec result by opening $(TEST_DIR)/gosec-results.xml"

cyclo:
	$(GO) install github.com/fzipp/gocyclo/cmd/gocyclo@latest
	gocyclo -over 20 -ignore "_test" ./