PYTHON_VERSION ?= 3.8
CARGO_HOME ?= $(HOME)/.cargo
PATH := $(HOME)/.rye/shims:$(HOME)/.local/bin:$(CARGO_HOME)/bin:$(PATH)

SHELL := /bin/bash
PYTHON_FILES := $(shell find src/ -type f -name '*.py' -o -name '*.pyi')

UV_PYTHON_PREFERENCE ?= only-managed
UV ?= uv
ifdef INSIDE_EMACS
UV_RUN ?= uv run --color never
else
UV_RUN ?= uv run
endif
RUN ?= $(UV_RUN)

REQUIRED_UV_VERSION ?= 0.7.2
bootstrap:
	@INSTALLED_UV_VERSION=$$(uv --version 2>/dev/null | awk '{print $$2}' || echo "0.0.0"); \
    DETECTED_UV_VERSION=$$(printf '%s\n' "$(REQUIRED_UV_VERSION)" "$$INSTALLED_UV_VERSION" | sort -V | head -n1); \
	if [ "$$DETECTED_UV_VERSION" != "$(REQUIRED_UV_VERSION)" ]; then \
		uv self update $(REQUIRED_UV_VERSION) || curl -LsSf https://astral.sh/uv/$(REQUIRED_UV_VERSION)/install.sh | sh; \
	fi
	@echo $(PYTHON_VERSION) > .python-version
.PHONY: bootstrap

install: bootstrap
	@$(UV) sync --python-preference=$(UV_PYTHON_PREFERENCE)
.PHONY: install

sync_extra_args ?=
sync: bootstrap
	@$(UV) sync --python-preference=$(UV_PYTHON_PREFERENCE) --frozen $(sync_extra_args)
.PHONY: sync

lock: bootstrap
ifdef update_all
	@$(UV) sync -U $(sync_extra_args)
else
	@$(UV) sync $(sync_extra_args)
endif
.PHONY: lock

update: bootstrap
	@$(MAKE) lock update_all=1
.PHONY: update


show-outdated: install-python pyproject.toml
	@$(UV) pip list --outdated --exclude djhtmx
.PHONY: show-outdated

format: install
	@$(RUN) ruff check --fix src/
	@$(RUN) isort src/
	@$(RUN) ruff format src/
.PHONY: format

lint: install
	@$(RUN) ruff check src/
	@$(RUN) ruff format --check src/
	@$(RUN) isort --check src/
.PHONY: lint

pytest_paths ?= "src/"
PYTEST_PATHS ?= $(pytest_paths)
PYTEST_HYPOTHESIS_ARGS ?=
PYTEST_EXTRA_ARGS ?=
PYTEST_FAILURE_ARGS ?= --ff --maxfail 1
PYTEST_ARGS ?= -l -q $(PYTEST_FAILURE_ARGS) $(PYTEST_EXTRA_ARGS) $(PYTEST_HYPOTHESIS_ARGS)
test: install
	@$(RUN) pytest $(PYTEST_ARGS) $(PYTEST_PATHS)
.PHONY: test

doctest: install
	@$(MAKE) SPHINXOPTS=$(SPHINXOPTS) SPHINXBUILD="$(RUN) sphinx-build" -C docs doctest
.PHONY: test

mypy: install
	@$(RUN) mypy -p xotless --config-file $(PWD)/mypy.ini
.PHONY: mypy

pyright: install
	@$(RUN) pyright src/xotless
.PHONY: pyright

py shell: install
	@$(RUN) ipython
.PHONY: py shell


SPHINXOPTS ?= -W
docs/build: install
	$(MAKE) SPHINXOPTS=$(SPHINXOPTS) SPHINXBUILD="$(RUN) sphinx-build" -C docs html
.PHONY: docs/build


CADDY_IMAGE ?= caddy:2.10-alpine
CADDY_SERVER_PORT ?= 6942
docs/browse: docs/build
	@docker run --rm --network host \
        -v $(PWD)/docs/build/html/:/var/www \
        -it $(CADDY_IMAGE) \
	    caddy file-server --browse --listen :$(CADDY_SERVER_PORT) --root /var/www
.PHONY: docs/browse
