# Default target to run tests and code checks before commit.
.PHONY: all
all: ruff-check test

# Clean up model images generated by the czbenchmarks in version 0.9
.PHONY: clean
clean:
	docker rmi cz-benchmarks-models:scvi || true
	docker rmi cz-benchmarks-models:uce || true
	docker rmi cz-benchmarks-models:scgpt || true
	docker rmi cz-benchmarks-models:scgenept || true
	docker rmi cz-benchmarks-models:geneformer || true
	docker rmi cz-benchmarks-models:transcriptformer || true
	docker rmi cz-benchmarks-models:aido || true

DESIRED_COVERAGE = 80
TEST_TYPE ?= unit

# Run all unit tests with coverage
.PHONY: test
test:
	@echo "Running $(TEST_TYPE) tests with coverage (minimum threshold: $(DESIRED_COVERAGE)%)"
	@if [ "$(TEST_TYPE)" != "unit" ]; then \
	  aws s3 sync s3://cz-benchmarks-results-dev/regression-test-fixtures/embeddings/ tests/fixtures/embeddings/ ; \
	fi
	@case "$(TEST_TYPE)" in \
	  unit) uv run pytest --cov=czbenchmarks --cov-report=term-missing tests/ -m "not integration" ;; \
	  integration) uv run pytest --cov=czbenchmarks --cov-report=term-missing tests/ -m integration ;; \
	  all) uv run pytest --cov=czbenchmarks --cov-report=term-missing tests/ -m "not integration or integration" ;; \
	  *) echo "Unknown TEST_TYPE=$(TEST_TYPE)"; exit 2 ;; \
	esac | tee coverage.txt
	@REPORTED_COVERAGE=$$(grep "TOTAL" coverage.txt | grep -o "[0-9]*%" | tr -d '%'); \
	if [ "$$REPORTED_COVERAGE" -lt $(DESIRED_COVERAGE) ]; then \
		echo "Test coverage ($$REPORTED_COVERAGE%) is below the required threshold of $(DESIRED_COVERAGE)%"; \
		exit 1; \
	else \
		echo "Test coverage ($$REPORTED_COVERAGE%) meets the required threshold of $(DESIRED_COVERAGE)%"; \
	fi

# Run all unit tests
.PHONY: test-unit
test-unit:
	$(MAKE) test

.PHONY: test-integration
test-integration:
	$(MAKE) test TEST_TYPE=integration

.PHONY: test-all
test-all:
	$(MAKE) test TEST_TYPE=all

# Check formatting with ruff
.PHONY: ruff-fmt-check
ruff-fmt-check:
	uv run ruff format --check .

# Fix formatting with ruff
.PHONY: ruff-fmt-fix
ruff-fmt-fix:
	uv run ruff format .

# Run ruff to check the code
.PHONY: ruff-code-check
ruff-check:
	uv run ruff check .

# Run ruff with auto-fix
.PHONY: ruff-code-fix
ruff-fix:
	uv run ruff check . --fix

# Run mypy type checking
.PHONY: mypy-check
mypy-check:
	uv run mypy src tests

# Run all linters and checkers # TODO: enable mypy-check
.PHONY: ruff-check
ruff: ruff-code-check ruff-fmt-check #mypy-check

.PHONY: ruff-fix
ruff-fix: ruff-code-fix ruff-fmt-fix

# alias
.PHONY: ruff
ruff: ruff-check

.PHONY: docs
docs:
	(cd docs && uv run make html)

.PHONY: docs-clean
docs-clean:
	rm -rf docs/source/autoapi
	(cd docs && uv run make clean)
	$(MAKE) docs