ROOT := $(shell pwd)
OUTPUT := $(ROOT)/output
OUTPUT_BIN := $(OUTPUT)/bin
GO_MODULE := github.com/tidbcloud/devops
HOST_GOOS := $(shell go env GOOS)
HOST_GOARCH := $(shell go env GOARCH)


.PHONY: build
build: build-devops-server build-jump-pod-agent build-migrate-proxy build-jump-gateway


build-%: OUTPUT_DIR ?= ./bin
build-%: BUILD_NAME ?= $*
build-%: BUILD_DIR ?= cmd/$(BUILD_NAME)
build-%: BUILD_GOOS ?= linux
build-%: BUILD_GOARCH ?= amd64
build-%:
	CGO_ENABLED=0 GOOS=$(BUILD_GOOS) GOARCH=$(BUILD_GOARCH) go build -o $(OUTPUT_DIR)/$(BUILD_NAME) -ldflags "-s -w" github.com/tidbcloud/devops/$(BUILD_DIR)


.PHONY: docker-build-devops-server
docker-build-devops-server: IMG ?= devops-server:latest
docker-build-devops-server: IMG_BUILD_DIR ?= ./images/devops-server
docker-build-devops-server: APP_ENV ?= dev
docker-build-devops-server: APP_PARTITION ?= global
docker-build-devops-server:
	make build-devops-server OUTPUT_DIR=$(IMG_BUILD_DIR)/bin

	docker build --build-arg APP_ENV=$(APP_ENV) --build-arg APP_PARTITION=$(APP_PARTITION) -t $(IMG) -f $(IMG_BUILD_DIR)/Dockerfile $(IMG_BUILD_DIR)


.PHONY: docker-build-jump-pod
docker-build-jump-pod: IMG ?= jump-pod:latest
docker-build-jump-pod: IMG_BUILD_DIR ?= ./images/jump-pod
docker-build-jump-pod:
	docker build -t $(IMG) -f $(IMG_BUILD_DIR)/Dockerfile $(IMG_BUILD_DIR)

.PHONY: docker-build-jump-pod-agent
docker-build-jump-pod-agent: IMG ?= jump-pod-agent:latest
docker-build-jump-pod-agent: IMG_BUILD_DIR ?= ./images/jump-pod-agent
docker-build-jump-pod-agent:
	make build-jump-pod-agent OUTPUT_DIR=$(IMG_BUILD_DIR)/bin

	docker build -t $(IMG) -f $(IMG_BUILD_DIR)/Dockerfile $(IMG_BUILD_DIR)


.PHONY: docker-build-jump-gateway
docker-build-jump-gateway: IMG ?= jump-gateway:latest
docker-build-jump-gateway: IMG_BUILD_DIR ?= ./images/jump-gateway
docker-build-jump-gateway:
	make build-jump-gateway OUTPUT_DIR=$(IMG_BUILD_DIR)/bin

	docker build -t $(IMG) -f $(IMG_BUILD_DIR)/Dockerfile $(IMG_BUILD_DIR)


.PHONY: docker-build-migrate-proxy
docker-build-migrate-proxy: IMG ?= migrate-proxy:latest
docker-build-migrate-proxy: IMG_BUILD_DIR ?= ./images/migrate-proxy
docker-build-migrate-proxy:
	make build-migrate-proxy OUTPUT_DIR=$(IMG_BUILD_DIR)/bin

	docker build -t $(IMG) -f $(IMG_BUILD_DIR)/Dockerfile $(IMG_BUILD_DIR)


.PHONY: test
test: TESTER ?= $(OUTPUT_BIN)/ginkgo
test: ENABLE_MIGRATE ?= 1 # set 0 to disable migrate test
test: install-ginkgo
	ENABLE_MIGRATE=$(ENABLE_MIGRATE) $(TESTER) run -v -race -cover --focus="TestMigrate" ./migrate

	$(TESTER) run -v -cover -r -p



.PHONY: lint
lint: LINTER ?= $(OUTPUT_BIN)/golangci-lint
lint: SWAGGER ?= $(OUTPUT_BIN)/swag
lint: install-lint generate
	git diff --exit-code

	$(LINTER) run ./...

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

.PHONY: generate
generate: generate-go generate-swagger generate-proto


generate-go: GEN_DIR ?= ./...
generate-go: install-mockgen install-dummygen
	GOBIN=$(OUTPUT_BIN) GO_MODULE=$(GO_MODULE) go generate $(GEN_DIR)

	go mod tidy


generate-swagger: SWAGGER ?= $(OUTPUT_BIN)/swag
generate-swagger: SWAGGER_LINT ?= $(OUTPUT_BIN)/swagger
generate-swagger: install-swagger install-swagger-lint
	$(SWAGGER) init --parseDependency -d pkg/controller,api,entity -g api_server.go -o docs/api

	$(SWAGGER) fmt -d pkg/controller

	$(SWAGGER_LINT) validate docs/api/swagger.json


generate-proto: BUF ?= $(OUTPUT_BIN)/buf
generate-proto: BUF_DIR ?= idl/proto
generate-proto: install-buf
	cd $(BUF_DIR) && $(BUF) generate 
	
	cd $(BUF_DIR) && $(BUF) format -w

	cd $(BUF_DIR) && $(BUF) lint

	cd $(BUF_DIR) && go mod tidy

.PHONY: install
install: install-lint install-mockgen install-swagger install-swagger-lint install-buf


install-lint:
	GOBIN=$(OUTPUT_BIN) go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11.4

install-mockgen:
	GOBIN=$(OUTPUT_BIN) go install go.uber.org/mock/mockgen@v0.6.0

install-dummygen:
	make build-dummygen OUTPUT_DIR=$(OUTPUT_BIN) BUILD_GOOS=$(HOST_GOOS) BUILD_GOARCH=$(HOST_GOARCH)

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

install-swagger-lint:
	GOBIN=$(OUTPUT_BIN) go install github.com/go-swagger/go-swagger/cmd/swagger@v0.33.2

install-buf:
	GOBIN=$(OUTPUT_BIN) go install github.com/bufbuild/buf/cmd/buf@v1.54.0

install-ginkgo:
	GOBIN=$(OUTPUT_BIN) go install github.com/onsi/ginkgo/v2/ginkgo@v2.28.1
