BINARY_DIR = ${CURDIR}/build/bin
OBSERVABILITY_REGIONAL_METERING_SERVER_BINARY = ${BINARY_DIR}/observability-regional-metering-server
BINARY_NAME = observability-regional-metering-server
DOCKERFILE_PATH = build/package/metering/Dockerfile
UT_IGNORE_FILES='replay.go'
# Docker variables
DOCKER_IMAGE ?= 552185537300.dkr.ecr.us-west-2.amazonaws.com/observability-regional-metering-server:latest

include Makefile.common

.PHONY: metering-server
metering-server:
	@echo "build o11y metering server start."
	$(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o ${OBSERVABILITY_REGIONAL_METERING_SERVER_BINARY} cmd/*.go
	@echo "build o11y metering server successfully."

.PHONY: build-for-docker
build-for-docker:
	@echo "Building metering server for Docker (linux/amd64)..."
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o ${BINARY_NAME} cmd/*.go
	@echo "Build for Docker completed."

.PHONY: docker
docker: build-for-docker
	@echo "Building Docker image: $(DOCKER_IMAGE)"
	docker build -t $(DOCKER_IMAGE) -f $(DOCKERFILE_PATH) .
	@echo "Docker image built successfully."

.PHONY: docker-push
docker-push: docker
	@echo "Pushing Docker image: $(DOCKER_IMAGE)"
	docker push $(DOCKER_IMAGE)
	@echo "Docker image pushed successfully."

.PHONY: clean
clean:
	@echo "Cleaning build artifacts..."
	rm -f $(BINARY_NAME)
	rm -rf $(BINARY_DIR)
	@echo "Clean completed."

.PHONY: mock
mock:
	$(GO) install go.uber.org/mock/mockgen@latest
	mockgen -destination ./mock/pkg/facade/mock_cluster_meta.go -source ./pkg/facade/iface/clustermeta.go  -package mock_o11ymetering
	mockgen -destination ./mock/pkg/facade/mock_db_readerwriter.go -source ./pkg/facade/iface/dbreaderwriter.go  -package mock_o11ymetering
	mockgen -destination ./mock/pkg/facade/mock_metricsquery.go -source ./pkg/facade/iface/metricsquery.go  -package mock_o11ymetering
	mockgen -destination ./mock/pkg/facade/mock_scheduletask.go -source ./pkg/facade/iface/scheduletask.go  -package mock_o11ymetering
	mockgen -destination ./mock/pkg/facade/mock_s3client.go -source ./pkg/facade/s3storage/client.go  -package mock_o11ymetering

.PHONY: lint
lint: mock
	$(GO) install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
	golangci-lint run --fix -v ./... --config .golangci.yml
	git diff --exit-code

.PHONY: cyclo
cyclo: mock
	$(GO) install github.com/fzipp/gocyclo/cmd/gocyclo@latest
	gocyclo -over 30 -ignore "_test|replaced" ./

.PHONY: ci_ut
ci_ut: mock ## UT for CI, do not run locally, run `make ut` instead.
	go install github.com/jstemmer/go-junit-report@latest
	$(GO) install github.com/boumenot/gocover-cobertura@v1.5.0
	$(GO) install gotest.tools/gotestsum@latest
	@-(gotestsum --junitfile ./unit-tests.xml --packages=${PACKAGES})
	-go test -v ${PACKAGES} -coverprofile=cover.out.tmp
	cat cover.out.tmp | grep -v '$(UT_IGNORE_FILES)' > cover.out
	gocover-cobertura < cover.out > coverage.xml

.PHONY: ut
ut: mock
	mkdir -p "$(TEST_DIR)"
	$(GO) install gotest.tools/gotestsum@latest
	@-(gotestsum --junitfile "$(TEST_DIR)/unit-tests.xml" --packages=${PACKAGES})
	-go test -v ${PACKAGES} -coverprofile="$(TEST_DIR)/cover.out.tmp"
	-cat $(TEST_DIR)/cover.out.tmp | grep -v '$(UT_IGNORE_FILES)' > "$(TEST_DIR)/cover.out"
	go tool cover -html "$(TEST_DIR)/cover.out" -o "$(TEST_DIR)/cover.html"
	@echo "check ut results in $(TEST_DIR)/unit-tests.xml"
	@echo "check ut coverage by opening $(TEST_DIR)/cover.html using browser"
