SHELL := /bin/bash -o pipefail
UNAME_OS := $(shell uname -s)
UNAME_ARCH := $(shell uname -m)

TMP_BASE := .tmp
TMP := $(TMP_BASE)/$(UNAME_OS)/$(UNAME_ARCH)
TMP_BIN = $(TMP)/bin

GOLINT_VERSION := 8f45f776aaf18cebc8d65861cc70c33c60471952
GOLINT := $(TMP_BIN)/golint
$(GOLINT):
	$(eval GOLINT_TMP := $(shell mktemp -d))
	@cd $(GOLINT_TMP); go get github.com/golang/lint/golint@$(GOLINT_VERSION)
	@rm -rf $(GOLINT_TMP)

ERRCHECK_VERSION := v1.2.0
ERRCHECK := $(TMP_BIN)/errcheck
$(ERRCHECK):
	$(eval ERRCHECK_TMP := $(shell mktemp -d))
	@cd $(ERRCHECK_TMP); go get github.com/kisielk/errcheck@$(ERRCHECK_VERSION)
	@rm -rf $(ERRCHECK_TMP)

STATICCHECK_VERSION := c2f93a96b099cbbec1de36336ab049ffa620e6d7
STATICCHECK := $(TMP_BIN)/staticcheck
$(STATICCHECK):
	$(eval STATICCHECK_TMP := $(shell mktemp -d))
	@cd $(STATICCHECK_TMP); go get honnef.co/go/tools/cmd/staticcheck@$(STATICCHECK_VERSION)
	@rm -rf $(STATICCHECK_TMP)

unexport GOPATH
export GO111MODULE := on
export GOBIN := $(abspath $(TMP_BIN))
export PATH := $(GOBIN):$(PATH)

.DEFAULT_GOAL := all

.PHONY: all
all: lint test

.PHONY: install
install:
	go install ./...

.PHONY: golint
golint: $(GOLINT)
	@# TODO: readd cmd/proto2gql when fixed
	@#for file in $(shell find . -name '*.go'); do
	for file in $(shell find . -name '*.go' | grep -v cmd/proto2gql); do \
		golint $${file}; \
		if [ -n "$$(golint $${file})" ]; then \
			exit 1; \
		fi; \
	done

.PHONY: vet
vet:
	go vet ./...

.PHONY: testdeps
errcheck: $(ERRCHECK)
	errcheck ./...

.PHONY: staticcheck
staticcheck: $(STATICCHECK)
	staticcheck -checks "all -U1000" ./...

.PHONY: lint
# TODO: readd errcheck when fixed
#lint: golint vet errcheck staticcheck
lint: golint vet staticcheck

.PHONY: test
test:
	go test -race ./...

.PHONY: clean
clean:
	go clean -i ./...

.PHONY: integration
integration:
	PB=y go test -cover
