BIN ?= $(PWD)/bin
OUTPUT ?= $(PWD)/output

COMMIT := $(shell git describe --dirty --always)

OS ?= $(shell uname | tr "[:upper:]" "[:lower:]")
ARCH ?= $(shell go env GOARCH)
GO := CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go
GO_TEST_ARGS ?= 
GO_TEST_COVERAGE_FILE ?= $(OUTPUT)/coverage.out
DOCKER := DOCKER_BUILDKIT=1 docker
IMAGE ?= hub.pingcap.net/qa/tcms
IMAGE_TAG ?= $(COMMIT)

LDFLAGS += -X "main.version=$(COMMIT)"
LDFLAGS += -X "main.buildTime=$(shell date -u '+%Y-%m-%dT%H:%M:%S')"

.PHONY: build image clean swag test install-swag ui lint fmt run-tiup gen

bin:
	@mkdir -p $(BIN)/$(OS)/$(ARCH)

output:
	@mkdir -p $(OUTPUT)

tcms: bin
	$(GO) build -o $(BIN)/$(OS)/$(ARCH)/tcms -ldflags '$(LDFLAGS)' cmd/tcms/main.go

jobs: bin
	$(GO) build -o $(BIN)/$(OS)/$(ARCH)/jobs -ldflags '$(LDFLAGS)' cmd/jobs/main.go

build: tcms jobs

# `ARCH=amd64 make build-image`
build-image: build
	$(DOCKER) build --build-arg arch=$(ARCH) --platform linux/$(ARCH) -t $(IMAGE):$(IMAGE_TAG)-$(ARCH) .

image-arm64:
	OS=linux ARCH=arm64 make -j2 build-image

image-amd64:
	OS=linux ARCH=amd64 make -j2 build-image

# Multi-arch image, support amd64 and arm64
image: image-amd64 image-arm64

image-push-amd64:
	$(DOCKER) push $(IMAGE):$(IMAGE_TAG)-amd64

image-push-arm64:
	$(DOCKER) push $(IMAGE):$(IMAGE_TAG)-arm64

image-push: image-push-arm64 image-push-amd64
	$(DOCKER) manifest create $(IMAGE):$(IMAGE_TAG) \
		--amend $(IMAGE):$(IMAGE_TAG)-amd64 \
		--amend $(IMAGE):$(IMAGE_TAG)-arm64
	$(DOCKER) manifest push --purge $(IMAGE):$(IMAGE_TAG)

upgrade-service:
	kubectl -n test-infra set image deployment/tcms main=hub.pingcap.net/qa/tcms:$(IMAGE_TAG)
	kubectl -n test-infra set image deployment/tcms-jobs main=hub.pingcap.net/qa/tcms:$(IMAGE_TAG)

gen:
	@go generate ./service/store/v2/ent/...

swag: install-swag
	swag init -g handler/handler.go --parseDependency --parseInternal --exclude db,docs,tests,ui

test: output run-meilisearch run-db test-migration
	@if [ "TiDB" = "`scripts/ping_db.sh`" ]; then \
		TCMS_LOG_LEVEL=error GODEBUG=netdns=go go test -v -race $(GO_TEST_ARGS) -parallel 1 ./... ; \
	else \
		TCMS_LOG_LEVEL=error GODEBUG=netdns=go go test -v -race $(GO_TEST_ARGS) ./... ; \
    fi

unit-test: test

test-coverage: 
	@mkdir -p $(OUTPUT)
	GO_TEST_ARGS="$(GO_TEST_ARGS) -coverprofile=$(GO_TEST_COVERAGE_FILE)" make test
	go tool cover -html="$(GO_TEST_COVERAGE_FILE)"

test-migration: install-migrate run-db
	@scripts/test_migration.sh

run-db: install-mycli
# Use MySQL if possible.
	@db_ready=`scripts/ping_db.sh`; \
	if [ "$$db_ready" != "MySQL" ] && [ "$$db_ready" != "TiDB" ]; then \
		make run-tiup; \
    fi

run-tiup: install-tiup
	@scripts/run_tiup_playground.sh
	@scripts/wait_tiup_playground.sh

kill-tiup:
	pgrep -f "tiup-playground" | xargs kill -TERM

run-meilisearch: install-meilisearch
	@scripts/run_meilisearch.sh
	@scripts/wait_meilisearch.sh
	cd meilisearch && make update-all

kill-meilisearch:
	pgrep -f "meilisearch" | xargs kill -TERM

fmt: install-goimports
	goimports -l -w -local "github.com/pingcap/test-infra"  .

lint: install-linter
# golangci-lint run --skip-dirs='(bin|docs|ui)'
	@echo 'Skip until <https://github.com/golangci/golangci-lint/issues/2649> fixed.'

ui:
	./scripts/pack_ui.sh

scc: install-scc
	@scc --exclude-dir 'docs,service/store/v2/ent'

clean: kill-tiup kill-meilisearch
	@rm -rfv $(BIN) $(OUTPUT)

# Install dependences

install-swag:
ifeq (, $(shell which swag))
	@{ \
	set -e ;\
	TMP_DIR=$$(mktemp -d) ;\
	cd $$TMP_DIR ;\
	GO111MODULE=on go install github.com/swaggo/swag/cmd/swag@latest ;\
	rm -rf $$TMP_DIR ;\
	}
endif

install-goimports:
ifeq (, $(shell which goimports))
	@{ \
	set -e ;\
	TMP_DIR=$$(mktemp -d) ;\
	cd $$TMP_DIR ;\
	GO111MODULE=on go install golang.org/x/tools/cmd/goimports@latest ;\
	rm -rf $$TMP_DIR ;\
	}
endif

install-linter:
ifeq (, $(shell which golangci-lint))
	go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
endif

install-tiup:
ifeq (, $(shell which tiup))
	curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
endif

install-meilisearch:
ifeq (, $(shell PATH=$$PATH:$(BIN) which meilisearch))
	mkdir -p $(BIN) && cd $(BIN) && curl -L https://install.meilisearch.com | sh
endif

install-migrate:
ifeq (, $(shell which migrate))
	go install -tags 'mysql' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
endif

install-scc:
ifeq (, $(shell which scc))
	go install github.com/boyter/scc@latest
endif

install-mycli:
ifeq (, $(shell which mycli))
	pip install -U mycli
endif
