SHELL := /bin/bash
GOPATH ?= $(shell go env GOPATH)
ROOT := $(shell pwd)
OUTPUT := $(ROOT)/output
OUTPUT_BIN := $(OUTPUT)/bin

# Ensure GOPATH is set before running build process.
ifeq "$(GOPATH)" ""
  $(error Please set the environment variable GOPATH before running `make`)
endif

_COMMIT := $(shell git describe --no-match --always --dirty)
_GITREF := $(shell git rev-parse --abbrev-ref HEAD)
COMMIT  := $(if $(COMMIT),$(COMMIT),$(_COMMIT))
GITREF  := $(if $(GITREF),$(GITREF),$(_GITREF))

REPO    := github.com/pingcap-inc/clinic

LDFLAGS := -w -s
LDFLAGS += -X "$(REPO)/pkg/version.GitHash=$(COMMIT)"
LDFLAGS += -X "$(REPO)/pkg/version.GitRef=$(GITREF)"
LDFLAGS += $(EXTRA_LDFLAGS)

BUILD_FLAG    := -trimpath -buildvcs=false
GOENVCGOOFF   := GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=amd64
GOCGOOFF      := $(GOENVCGOOFF) go
GOBUILDCGOOFF := $(GOCGOOFF) build $(BUILD_FLAG) -ldflags '$(LDFLAGS)'
GOTEST        := GO111MODULE=on GODEBUG=cgocheck=0 CGO_ENABLED=0 go test -v
TEST_LDFLAGS  := ""

PACKAGE_LIST := go list ./...| grep -vE "cmd"
PACKAGES     := $$($(PACKAGE_LIST))

.PHONY: mod
mod:
	GOPRIVATE=github.com/tidbcloud,github.com/pingcap/dbaas $(GOCGOOFF) mod tidy

.PHONY: check-mod
check-mod: mod
	git diff --exit-code -- go.mod go.sum

.PHONY: check
check: install-tools check-mod check-swagger check-lint

.PHONY: install-tools
install-tools: install-lint install-swagger

.PHONY: install-swagger
install-swagger:
	GOBIN=$(OUTPUT_BIN) go install github.com/swaggo/swag/cmd/swag@v1.16.2

.PHONY: install-lint
install-lint:
	GOBIN=$(OUTPUT_BIN) go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.8

.PHONY: test
test:
	$(GOTEST) -parallel 1 -p 1 -covermode=atomic -coverprofile=coverage.out -coverpkg=./... ./... 2>&1 | tee test_out.log
	go tool cover -html=coverage.out -o coverage.html

.PHONY: lint
lint: LINTER ?= $(OUTPUT_BIN)/golangci-lint
lint: install-lint
	$(LINTER) run --timeout 10m0s ./...

.PHONY: lint-fix
lint-fix: LINTER ?= $(OUTPUT_BIN)/golangci-lint
lint-fix: install-lint
	$(LINTER) run --timeout 10m0s --fix ./...

.PHONY: check-lint
check-lint: lint-fix
	git diff --exit-code -- .

.PHONY: generate-swagger
generate-swagger: SWAGGER ?= $(OUTPUT_BIN)/swag
generate-swagger: install-swagger
	$(SWAGGER) init --parseDependency  --instanceName=cloud_server_api -dir=cmd/cloud_server/,pkg/ -output=docs

.PHONY: format-swagger
format-swagger: SWAGGER ?= $(OUTPUT_BIN)/swag
format-swagger: generate-swagger
	$(SWAGGER) fmt -g=cmd/cloud_server/main.go

.PHONY: check-swagger
check-swagger: format-swagger
	git diff --exit-code -- docs/

.PHONY: build-cloud-server
build-cloud-server:
	$(GOBUILDCGOOFF) -o bin/cloud_server ./cmd/cloud_server

.PHONY: docker_build_cloud_server
docker_build_cloud_server: build-cloud-server
	docker build -f Dockerfile -t ${IMG} .