#
# 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.
#

# Check if this GO tools version used is at least the version of go specified in
# the go.mod file. The version in go.mod should be in sync with other repos.
GO_VERSION := $(shell go version | awk '{print substr($$3, 3, 10)}')
MOD_VERSION := $(shell awk '/^go/ {print $$2}' go.mod)

GM := $(word 1,$(subst ., ,$(GO_VERSION)))
MM := $(word 1,$(subst ., ,$(MOD_VERSION)))
FAIL := $(shell if [[ $(GM) -lt $(MM) ]]; then echo MAJOR; fi)
ifdef FAIL
$(error Build should be run with at least go $(MOD_VERSION) or later, found $(GO_VERSION))
endif
GM := $(word 2,$(subst ., ,$(GO_VERSION)))
MM := $(word 2,$(subst ., ,$(MOD_VERSION)))
FAIL := $(shell if [[ $(GM) -lt $(MM) ]]; then echo MINOR; fi)
ifdef FAIL
$(error Build should be run with at least go $(MOD_VERSION) or later, found $(GO_VERSION))
endif

# Retrieve the protobuf version defined in the go module, and download the same version of binary for the build
# This variable will be exported and accessed from lib/go/Makefile
PROTOBUF_VERSION := $(shell go list -m 'github.com/golang/protobuf' | cut -d' ' -f 2)
ifndef PROTOBUF_VERSION
$(error Build requires to set a proper version of github.com/golang/protobuf in go.mod file)
endif
export PROTOBUF_VERSION

# Make sure we are in the same directory as the Makefile
BASE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

SI_SPEC := scheduler-interface-spec.md
SI_PROTO := si.proto

LIB_DIR := lib/go
COMMON_LIB := $(LIB_DIR)/common
CONSTANTS_GO := $(COMMON_LIB)/constants.go

define GENERATED_HEADER

// Code generated by make build. DO NOT EDIT

endef
export GENERATED_HEADER

define PACKAGE_DEF
package common

endef
export PACKAGE_DEF

all:
	$(MAKE) -C $(dir $(BASE_DIR)) build

# Generate the proto file from the spec, leave proto untouched if there are no changes
$(SI_PROTO).tmp: $(SI_SPEC)
	@echo "$$GENERATED_HEADER" > $@
	cat $< | sed -n -e '/```protobuf$$/,/^```$$/ p' | sed '/^```/d' >> $@
	awk '{ if (length > 200) print NR, $$0 }' $@ | diff - /dev/null
	(diff $@ $(SI_PROTO) > /dev/null 2>&1 || mv -f $@ $(SI_PROTO)) && \
		rm -f $@

$(CONSTANTS_GO).tmp: $(SI_SPEC)
	test -d $(COMMON_LIB) || mkdir -p $(COMMON_LIB)
	@echo "$$GENERATED_HEADER" > $@
	@echo "$$PACKAGE_DEF" >> $@
	cat $< | sed -n -e '/``constants$$/,/^```$$/ p' | sed '/^```/d' >> $@
	(diff $@ $(CONSTANTS_GO) > /dev/null 2>&1 || mv -f $@ $(CONSTANTS_GO)) && \
		rm -f $@

# Build the go language bindings from the spec via a generated proto
build: $(SI_PROTO).tmp $(CONSTANTS_GO).tmp
	$(MAKE) -C $(LIB_DIR)

# Set a empty recipe
.PHONY: test
test:
	@echo ""

# Check for missing license headers
.PHONY: license-check
license-check:
	@echo "checking license header"
	@licRes=$$(grep -Lr --exclude-dir=lib --include=*.{go,sh,md,yaml,mod} "Licensed to the Apache Software Foundation" .) ; \
	if [ -n "$${licRes}" ]; then \
		echo "following files have incorrect license header:\n$${licRes}" ; \
		exit 1; \
	fi

# Simple clean of generated files only (no local cleanup).
.PHONY: clean
clean:
	rm -rf $(COMMON_LIB)
	cd $(BASE_DIR) && \
	$(MAKE) -C $(LIB_DIR) $@

# Remove all non versioned files,
# Running this target will trigger a re-install of protoc etc in te next build cycle.
.PHONY: clobber
clobber:
	cd $(BASE_DIR) && \
	$(MAKE) -C $(LIB_DIR) $@
