.PHONY: \
	docker-build build clean \
	generate generate_mock generate_buf \
	verify test check check-golang check-idl check-pulumi \
	gapi-lint

BIN     = bin
GOBIN   = $(abspath $(BIN))
GOENVS  = GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=amd64
GOFLAGS = -ldflags "-s -w " -v

export DOCKER_BUILDKIT := 1
export GOBIN           := $(GOBIN)
export PATH            := ${GOBIN}:$(PATH)
export SHELL           := /bin/bash

build: generate
	$(GOENVS) go build $(GOFLAGS) -o bin/dataapi_server cmd/dataapi/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/central_server cmd/central/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/regioncentral_server cmd/regioncentral/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/dataapi_gateway_server cmd/dataapi_gateway/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/dataapi_executor_server cmd/dataapi_executor/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/central_worker cmd/central_worker/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/dataapi_control_server cmd/dataapi_control/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/adminapi_server cmd/adminapi/main.go
	$(GOENVS) go build $(GOFLAGS) -o bin/dataservice_tools cmd/tools/main.go

generate: generate_buf

regenerate: clean generate


generate_buf: $(BIN)/buf
	cd idl/idl && ${GOBIN}/buf generate

verify: check test

check: check-golang check-buf check-pulumi

test:
	go test -race -p=2 ./...

check-golang: $(BIN)/golangci-lint generate
	${GOBIN}/golangci-lint run -v

check-buf: generate_buf
	cd idl/idl && buf lint

check-pulumi:
	./hack/check_pulumi.sh

clean:
	go clean
	rm -f $(BIN)/*

coverage-after-test: $(BIN)/gcov2lcov
	cat coverage/coverage.out | grep -v 'mock*.go' > coverage/cover.out
	${GOBIN}/gcov2lcov -infile=coverage/cover.out -outfile=coverage/coverage.out.lcov

$(BIN):
	@mkdir -p $@

$(BIN)/%: $(BIN)
	go install $(PACKAGE)

# bufbuild requires go1.18 since v1.1.1.
$(BIN)/buf: PACKAGE=github.com/bufbuild/buf/cmd/buf@v1.25.0
$(BIN)/buf: ${BIN}/protoc-gen-buf-breaking ${BIN}/protoc-gen-buf-lint ${BIN}/protoc-gen-go ${BIN}/protoc-gen-go-grpc ${BIN}/protoc-gen-grpc-gateway ${BIN}/protoc-gen-openapiv2

$(BIN)/protoc-gen-buf-breaking: PACKAGE=github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@v1.25.0

$(BIN)/protoc-gen-buf-lint: PACKAGE=github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v1.25.0

$(BIN)/protoc-gen-go: PACKAGE=google.golang.org/protobuf/cmd/protoc-gen-go@v1.28

$(BIN)/protoc-gen-go-grpc: PACKAGE=google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

$(BIN)/protoc-gen-grpc-gateway: PACKAGE=github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v2.10.3

$(BIN)/protoc-gen-openapiv2: PACKAGE=github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@v2.10.3

$(BIN)/mockgen: PACKAGE=github.com/golang/mock/mockgen@v1.6.0

$(BIN)/goqueryset: PACKAGE=github.com/tidbcloud/go-queryset/cmd/goqueryset@latest

$(BIN)/gotestsum: PACKAGE=gotest.tools/gotestsum@latest

$(BIN)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46

$(BIN)/gcov2lcov: PACKAGE=github.com/jandelgado/gcov2lcov@v1.0.5

fmt: $(BIN)/buf
	cd idl/idl && ${GOBIN}/buf format -w

gapi-lint:
	cd idl/idl; \
	set -e ;\
	TMP=$$(mktemp -d) ;\
	buf export . --output $$TMP ;\
	api-linter -I $$TMP "adminapi/v1beta1/service.proto" ;\
	rm -rf $$TMP;
