GOOS ?= $(shell go env GOOS)
GOARCH ?= $(shell go env GOARCH)
BUILD_ARCH ?= linux/$(GOARCH)

# trivy default vulneeability level
SEVERITY ?= "CRITICAL"

# Git information
GIT_VERSION ?= $(shell git describe --tags --abbrev=8 --dirty) # attention: gitlab CI: git fetch should not use shallow
GIT_COMMIT_HASH ?= $(shell git rev-parse HEAD)
GIT_TREESTATE = "clean"
GIT_DIFF = $(shell git diff --quiet >/dev/null 2>&1; if [ $$? -eq 1 ]; then echo "1"; fi)
ifeq ($(GIT_DIFF), 1)
    GIT_TREESTATE = "dirty"
endif

# Images management
REGISTRY_SERVER_ADDRESS?="release-ci.daocloud.io"
REGISTRY_REPO?="$(REGISTRY_SERVER_ADDRESS)/infacc"
DAI_BENCH_HELPER_IMAGE_REPO ?= release-ci.daocloud.io/inferx/dai-bench-helper
DAI_BENCH_HELPER_IMAGE_TAG ?= latest
DAI_BENCH_HELPER_IMAGE ?= $(DAI_BENCH_HELPER_IMAGE_REPO):$(DAI_BENCH_HELPER_IMAGE_TAG)

# Set your version by env or using latest tags from git
VERSION?=""
ifeq ($(VERSION), "")
	# The official tag version will be passed in from the environment variable. If the development version is not passed in, mark the dev tag
    LATEST_DEV_TAG=$(shell ./hack/release/get-version.sh dai_bench)-dev-$(shell git rev-parse --short=8 HEAD)
    ifeq ($(LATEST_DEV_TAG),)
        # Forked repo may not sync tags from upstream, so give it a default tag to make CI happy.
        VERSION="unknown"
    else
        VERSION=$(LATEST_DEV_TAG)
    endif
endif

PIP := python3 -m pip
UV := $(shell command -v uv 2>/dev/null || echo $$HOME/.local/bin/uv)

# convert to git version to semver version v0.1.1-14-gb943a40 --> v0.1.1+14-gb943a40
DAI_BENCH_VERSION := $(shell echo $(VERSION) | sed 's/-/+/1')

# convert to git version to semver version v0.1.1+14-gb943a40 --> v0.1.1-14-gb943a40
DAI_BENCH_IMAGE_VERSION := $(shell echo $(DAI_BENCH_VERSION) | sed 's/+/-/1')

.PHONY: release
release: dai-bench-imgs

.PHONY: dai-bench-imgs
dai-bench-imgs: dai-bench

.PHONY: dai-bench
dai-bench: $(SOURCES) docker-login
	echo "Building dai-bench for arch = $(BUILD_ARCH)"
	export DOCKER_CLI_EXPERIMENTAL=enabled ;\
	docker buildx rm dai-bench-multi-platform-builder >/dev/null 2>&1 || true ;\
	docker buildx create --use --platform=$(BUILD_ARCH) --name dai-bench-multi-platform-builder --driver-opt image=docker.m.daocloud.io/moby/buildkit:buildx-stable-1 ;\
	docker buildx build \
			--build-arg dai-bench_version=$(DAI_BENCH_VERSION) \
			--build-arg DAI_BENCH_HELPER_IMAGE=$(DAI_BENCH_HELPER_IMAGE) \
			--build-arg HTTP_PROXY=${dai_bench_proxy} \
			--builder dai-bench-multi-platform-builder \
			--platform $(BUILD_ARCH) \
			--tag $(REGISTRY_REPO)/dai-bench:$(DAI_BENCH_IMAGE_VERSION)  \
			--tag $(REGISTRY_REPO)/dai-bench:latest  \
			-f dockerfile \
			--push \
			.

.PHONY: dai-bench-helper
dai-bench-helper: docker-login
	echo "Building dai-bench helper for arch = $(BUILD_ARCH)"
	export DOCKER_CLI_EXPERIMENTAL=enabled ;\
	! ( docker buildx ls | grep dai-bench-multi-platform-builder ) && docker buildx create --use --platform=$(BUILD_ARCH) --name dai-bench-multi-platform-builder --driver-opt image=docker.m.daocloud.io/moby/buildkit:buildx-stable-1 ;\
	docker buildx build \
			--build-arg PIP_INDEX_URL=$(PIP_INDEX_URL) \
			--build-arg PIP_TRUSTED_HOST=$(PIP_TRUSTED_HOST) \
			--build-arg HF_ENDPOINT=$(HF_ENDPOINT) \
			--builder dai-bench-multi-platform-builder \
			--platform $(BUILD_ARCH) \
			--tag $(DAI_BENCH_HELPER_IMAGE_REPO):$(DAI_BENCH_HELPER_IMAGE_TAG) \
			$(if $(DAI_BENCH_HELPER_IMAGE_EXTRA_TAG),--tag $(DAI_BENCH_HELPER_IMAGE_REPO):$(DAI_BENCH_HELPER_IMAGE_EXTRA_TAG),) \
			-f dockerfile.helper \
			--push \
			.

.PHONY: docker-login
docker-login:docker-login
	@echo "push images to $(REGISTRY_REPO)"
	echo ${REGISTRY_PASSWORD} | docker login ${REGISTRY_SERVER_ADDRESS} -u ${REGISTRY_USER_NAME} --password-stdin

.PHONY: uv
uv:
	@if ! command -v uv >/dev/null 2>&1; then \
		echo "Installing uv..."; \
		UV_INSTALL_SCRIPT="$$(mktemp)"; \
		curl --retry 5 --retry-delay 3 --retry-all-errors --connect-timeout 20 -LsSf https://astral.sh/uv/install.sh -o "$$UV_INSTALL_SCRIPT"; \
		sh "$$UV_INSTALL_SCRIPT"; \
		rm -f "$$UV_INSTALL_SCRIPT"; \
	fi

.PHONY: lint
lint: uv
	@echo "Installing style and type check dependencies..."
	$(UV) --version; \
	$(UV) venv --clear; \
	. .venv/bin/activate && $(UV) pip install tox tox-uv ruff mdformat mypy types-PyYAML types-requests;
	@echo "Running style and types check..."
	. .venv/bin/activate && tox -e style,types;

.PHONY: test
test: uv
	@echo "Installing test dependencies..."
	$(UV) venv --clear; \
	. .venv/bin/activate && $(UV) pip install pytest pytest-cov; \
	. .venv/bin/activate && $(UV) pip install -e .;
	@echo "Running unit tests..."
	. .venv/bin/activate && pytest tests/ -v --tb=short --cov=dai_bench --cov-report=term-missing;

.PHONY: security-scanning
security-scanning:
	chmod +x ./hack/trivy.sh
	SEVERITY="$(SEVERITY)" ./hack/trivy.sh \
	$(REGISTRY_REPO)/dai-bench:$(DAI_BENCH_IMAGE_VERSION)

.PHONY: gen-release
gen-release:
	hack/release/release.sh

DAI_BENCH_IMAGE_INFO := $(subst ",,$(REGISTRY_REPO)/dai-bench:$(DAI_BENCH_IMAGE_VERSION))
.PHONY: e2e-shell-check
e2e-shell-check:
	bash -n tests/util.sh tests/e2e/k8s_client.sh tests/e2e/local_client.sh tests/e2e/local_server.sh tests/e2e/run_e2e.sh tests/e2e/shell_checks.sh
	bash tests/e2e/shell_checks.sh

.PHONY: e2e-test
e2e-test: e2e-shell-check
	bash tests/e2e/run_e2e.sh $(DAI_BENCH_IMAGE_INFO)
