include e2e-commands.mk

GOPRIVATE:="github.com/tidbcloud/*"
MAKEFILE_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))

GO_SWAGGER:=GOPRIVATE=$(GOPRIVATE) go run "github.com/go-swagger/go-swagger/cmd/swagger@latest"
OPENAPI_GENERATOR:=docker run --rm -v ${MAKEFILE_DIR}:/local openapitools/openapi-generator-cli:v7.12.0 generate --additional-properties=disallowAdditionalPropertiesIfNotPresent=false

default: dev

.PHONY: dev
dev: generate mod fmt build test

.PHONY: vet
vet:
	GOPRIVATE=$(GOPRIVATE) go vet ./...

.PHONY: mod
mod:
	GOPRIVATE=$(GOPRIVATE) go mod tidy
	GOPRIVATE=$(GOPRIVATE) go mod download

.PHONY: generate-go-client
generate-client-go: client-go-bffapi-v1beta1 \
					client-go-openapi-dedicated-v1beta1 \
                    client-go-openapi-serverless-v1beta1 \
                    client-go-central \
                    client-go-openapi-v1beta \
                    client-go-serverless-svc \
                    client-go-account \
                    client-go-dataflow \
                    client-go-audit
	GOPRIVATE=$(GOPRIVATE) go generate ./...

.PHONY: client-go-bffapi-v1beta1
client-go-bffapi-v1beta1:
	cp ../api/spec/bff/cluster_management/v1beta1/services.ui.swagger.json pkg/bffapi/services.ui.swagger.json
	rm -rf pkg/bffapi/client
	$(OPENAPI_GENERATOR) -i /local/pkg/bffapi/services.ui.swagger.json \
		--skip-validate-spec \
		-g go \
		-o /local/pkg/bffapi/client \
		-p packageName=client,enumClassPrefix=true
	cd pkg/bffapi/client && rm -rf .openapi-generator/ api/ test/ docs/ .gitignore .openapi-generator-ignore .travis.yml git_push.sh go.mod go.sum
	$(MAKE) mod

.PHONY: client-go-openapi-dedictaed-v1beta1
client-go-openapi-dedicated-v1beta1:
# open api
	cp ../api/spec/tidb_cloud_open_api/dedicated/v1beta1/services.swagger.json pkg/dedicatedapi/api/services.swagger.json
	rm -rf pkg/dedicatedapi/api/client
	$(OPENAPI_GENERATOR) -i /local/pkg/dedicatedapi/api/services.swagger.json \
		--skip-validate-spec \
		-g go \
		-o /local/pkg/dedicatedapi/api/client \
		-p packageName=client,enumClassPrefix=true
	cd pkg/dedicatedapi/api/client && rm -rf .openapi-generator/ api/ test/ docs/ .gitignore .openapi-generator-ignore .travis.yml git_push.sh go.mod go.sum
	$(MAKE) mod
# ui api
	cp ../api/spec/tidb_cloud_open_api/dedicated/v1beta1/services.ui.swagger.json pkg/dedicatedapi/console/services.ui.swagger.json
	rm -rf pkg/dedicatedapi/console/client
	$(OPENAPI_GENERATOR) -i /local/pkg/dedicatedapi/console/services.ui.swagger.json \
		--skip-validate-spec \
		-g go \
		-o /local/pkg/dedicatedapi/console/client \
		-p packageName=client,enumClassPrefix=true
	cd pkg/dedicatedapi/console/client && rm -rf .openapi-generator/ api/ test/ docs/ .gitignore .openapi-generator-ignore .travis.yml git_push.sh go.mod go.sum
	$(MAKE) mod

.PHONY: client-go-openapi-serverless-v1beta1
client-go-openapi-serverless-v1beta1:
# Do not regenerate the client code for serverless api.
# There is a bug for go-swagger supporting `allof` in the swagger file.
#
#	cp ../api/spec/tidb_cloud_open_api/serverless/v1beta1/services.swagger.json pkg/serverlessapi/serverless.swagger.json
#	cp ../api/spec/tidb_cloud_open_api/serverless/v1beta1/services.ui.swagger.json pkg/serverlessapi/serverless.ui.swagger.json
#	rm -rf pkg/serverlessapi/api/client pkg/serverlessapi/api/model && $(GO_SWAGGER) generate client \
#		--spec=pkg/serverlessapi/serverless.swagger.json \
#		--target=pkg/serverlessapi/api \
#		--client-package=client \
#		--model-package=model \
#		--skip-validation
#	rm -rf pkg/serverlessapi/console/client pkg/serverlessapi/console/model && $(GO_SWAGGER) generate client \
#		--spec=pkg/serverlessapi/serverless.ui.swagger.json \
#		--target=pkg/serverlessapi/console \
#		--client-package=client \
#		--model-package=model \
#		--skip-validation
	$(MAKE) mod

.PHONY: client-go-central
client-go-central:
	rm -rf core-svc && git clone git@github.com:tidbcloud/core-svc.git
	cp core-svc/idl/pbgen/proto/central/service.swagger.json pkg/cm/service.swagger.json
	rm -rf core-svc
	rm -rf pkg/coreportalapi/client pkg/coreportalapi/model && $(GO_SWAGGER) generate client \
		--spec=pkg/coreportalapi/service.swagger.json \
		--target=pkg/coreportalapi/ \
		--client-package=client \
		--model-package=model \
		--skip-validation
	$(MAKE) mod


.PHONY: client-go-openapi-v1beta
client-go-openapi-v1beta:
# Do not regenerate the client code for openapi api.
# There is a bug for go-swagger causing conflict struct name.
#
#	rm -rf idl && git clone git@github.com:tidbcloud/idl.git
#	cp idl/pbgen/oas/spec.swagger.json pkg/openapiv1beta/spec.swagger.json
#	rm -rf idl
#	rm -rf pkg/openapiv1beta/client pkg/openapiv1beta/model && $(GO_SWAGGER) generate client \
#		--spec=pkg/openapiv1beta/spec.swagger.json \
#		--target=pkg/openapiv1beta/ \
#		--client-package=client \
#		--model-package=model \
#		--skip-validation
	$(MAKE) mod

.PHONY: client-go-serverless-svc
client-go-serverless-svc:
	rm -rf serverless-service && git clone git@github.com:tidbcloud/serverless-service.git
	cp serverless-service/apidocs/billing.swagger.json pkg/serverlesssvc/billing.swagger.json
	rm -rf serverless-service
	rm -rf pkg/serverlesssvc/client pkg/serverlesssvc/model && $(GO_SWAGGER) generate client \
		--spec=pkg/serverlesssvc/billing.swagger.json \
		--target=pkg/serverlesssvc/ \
		--client-package=client \
		--model-package=model \
		--skip-validation
	$(MAKE) mod

.PHONY: client-go-account
client-go-account:
	rm -rf account && git clone git@github.com:tidbcloud/account.git
	cp account/central/docs/service.swagger.json pkg/account/account.swagger.json
	rm -rf account
	rm -rf pkg/account/client pkg/account/model && $(GO_SWAGGER) generate client \
		--spec=pkg/account/account.swagger.json \
		--target=pkg/account/ \
		--client-package=client \
		--model-package=model \
		--skip-validation
	$(MAKE) mod

.PHONY: client-go-dataflow
client-go-dataflow:
	rm -rf dataflow-service && git clone git@github.com:tidbcloud/dataflow-service.git
	cp dataflow-service/api/service.swagger.json pkg/dataflow/dataflow.swagger.json
	rm -rf dataflow-service
	rm -rf pkg/dataflow/client pkg/dataflow/model && $(GO_SWAGGER) generate client \
		--spec=pkg/dataflow/dataflow.swagger.json \
		--target=pkg/dataflow/ \
		--client-package=client \
		--model-package=model \
		--skip-validation
	$(MAKE) mod

.PHONY: client-go-audit
client-go-audit:
#   There are some bugs in the auditservice/docs/swagger.json, so we can't use it directly.
#   The pkg/auditservice/swagger.json has been modified manually.

#	rm -rf auditservice && git clone git@github.com:tidbcloud/auditservice.git
#	cp auditservice/docs/swagger.json pkg/auditservice/swagger.json
#	rm -rf auditservice
	rm -rf pkg/auditservice/client pkg/auditservice/model && $(GO_SWAGGER) generate client \
		--spec=pkg/auditservice/swagger.json \
		--target=pkg/auditservice/ \
		--client-package=client \
		--model-package=model \
		--skip-validation
	$(MAKE) mod

.PHONY: fmt
fmt:
	GOPRIVATE=$(GOPRIVATE) go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11 run --config $(MAKEFILE_DIR)/../.golangci.yml --fix

.PHONY: lint
lint:
	GOPRIVATE=$(GOPRIVATE) go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11 run --config $(MAKEFILE_DIR)/../.golangci.yml

.PHONY: test
test:
	#echo "not implemented"

.PHONY: build
build:
	#echo "not implemented"

.PHONY: generate
generate:
	#echo "not implemented"
