#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
-include .env

#VERSION := $(shell git describe --tags)
#BUILD := $(shell git rev-parse --short HEAD)
PROJECTNAME := $(shell basename "$(PWD)")

# Go related variables.
GOBASE := $(shell pwd)
#GOPATH := $(GOBASE)/vendor:$(GOBASE)
GOPATH := $${HOME}/.mvnGoLang/.go_path:$(GOBASE)
GOBIN := $(GOBASE)/bin
GOFILES := $(wildcard *.go)

# Mvn related variables
MVNBIN := ../mvnw

# Use linker flags to provide version/build settings
#LDFLAGS=-ldflags "-X=main.Version=$(VERSION) -X=main.Build=$(BUILD)"

# Redirect error output to a file, so we can show it in development mode.
STDERR := /tmp/.$(PROJECTNAME)-stderr.txt

# Make is verbose in Linux. Make it silent.
MAKEFLAGS += --silent

## install: Install missing dependencies. Runs `mvn verify` internally.
install: go-get

## watch: Run given command when code changes. e.g; make watch run="echo 'hey'"
watch:
	@GOPATH=$(GOPATH) GOBIN=$(GOBIN) yolo -i . -e vendor -e bin -c "$(run)"

## compile: Compile the binary.
compile: target
	@-touch $(STDERR)
	@-rm $(STDERR)
	@-$(MAKE) -s go-compile 2> $(STDERR)
	@cat $(STDERR) | sed -e '1s/.*/\nError:\n/'  | sed 's/make\[.*/ /' | sed "/^/s/^/     /" 1>&2

## test: Runs test. Runs `mvn test` internally.
test: compile
	$(MVNBIN) test

## test: Runs gotestsum.
test-readable: compile
	@GOPATH=$(GOPATH) GOBIN=$(GOBIN) gotestsum ./...

test-readable-mvn: compile
	$(MVNBIN) mvn-golang-wrapper:custom@readable-test

## exec: Run given command, wrapped with custom GOPATH. e.g; make exec run="go test ./..."
exec:
	@GOPATH=$(GOPATH) GOBIN=$(GOBIN) $(run)

## clean: Clean build files. Runs `mvn clean` internally.
clean:
	@-$(MAKE) go-clean

go-compile: go-get go-build

go-build: go-fmt
	@echo "  >  Building binary..."
	$(MVNBIN) compile

go-get:
	@echo "  >  Checking if there is any missing dependencies..."
	$(MVNBIN) verify

go-generate:
	@GOPATH=$(GOPATH) GOBIN=$(GOBIN) go generate ./...

go-install: go-build
	$(MVNBIN) install

go-clean:
	@echo "  >  Cleaning build cache"
	$(MVNBIN) clean

go-fmt:
	@GOPATH=$(GOPATH) GOBIN=$(GOBIN) go fmt ./...

.PHONY: help
all: help
help: Makefile
	@echo
	@echo " Choose a command run in "$(PROJECTNAME)":"
	@echo
	@sed -n 's/^##//p' $< | column -t -s ':' |  sed -e 's/^/ /'
	@echo
