PYTHON_MINOR := $(shell uv run python --version 2>&1 | sed 's/Python 3\.\([0-9]*\).*/\1/')
TEST_GROUP_PY311 := test_py311_or_lower
TEST_GROUP_PY312 := test_py312_or_higher
DEFAULT_TEST_GROUP := $(shell [ "$(PYTHON_MINOR)" -le "11" ] && echo "$(TEST_GROUP_PY311)" || echo "$(TEST_GROUP_PY312)")

hooks:
	uv run --group dev pre-commit install

EVAL ?=
check:
	@status=0; \
	uv run --group dev ruff format || status=1; \
	uv run --group dev ruff check --fix || status=1; \
	uv run --group dev --extra test mypy src tests || status=1; \
	uv run --group dev python tools/generate_readmes.py --create-missing-readmes || status=1; \
	uv run --group dev python tools/generate_asset_manifest.py || status=1; \
	uv run --group dev python tools/check_unlisted_evals.py || status=1; \
	uv run --group dev python tools/check_changelog.py || status=1; \
	uv lock --check || status=1; \
	uv run --group dev pre-commit run markdownlint-fix --all-files || status=1; \
	uv run --group dev actionlint -no-color -oneline || status=1; \
	uv run --group dev zizmor --no-progress --persona=auditor --min-severity=low --fix=safe .github/workflows/ .github/actions/ || status=1; \
	if [ -n "$(EVAL)" ]; then uv run --group dev python tools/run_autolint.py $(EVAL) || status=1; fi; \
	exit $$status

TEST_ARGS ?=
TEST_EXTRAS ?= test
TEST_GROUPS ?= $(DEFAULT_TEST_GROUP)
test:
	@echo "PYTHON_MINOR=$(PYTHON_MINOR)"
	@echo "TEST_GROUPS=$(TEST_GROUPS)"
	@echo "TEST_EXTRAS=$(TEST_EXTRAS)"
	GIT_LFS_SKIP_SMUDGE=1 uv run \
		--group dev \
		$(addprefix --extra ,$(TEST_EXTRAS)) \
		$(addprefix --group ,$(TEST_GROUPS)) \
		pytest $(TEST_ARGS)

docs:
	uv run --extra doc quarto render docs

DRY_RUN ?= true
CLEAN_ARGS ?=
clean:
ifeq ($(DRY_RUN),false)
	uv run python ./tools/clean.py --no-dry-run $(CLEAN_ARGS)
else
	uv run python ./tools/clean.py $(CLEAN_ARGS)
endif

.PHONY: hooks check test clean docs
