VENV := .venv
PYTHON := $(VENV)/bin/python
PIP := $(VENV)/bin/pip
WHEELS_DIR := wheels
REQUIREMENTS := requirements.txt

MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help
PKG := $(filter-out $(MAKECMDGOALS_TARGETS),$(MAKECMDGOALS))

.PHONY: install freeze wheels sync sync-offline clean help venv

help:
	@echo "make install <pkg> [<pkg> ...]  - установить пакет(ы) в $(VENV), обновить $(REQUIREMENTS), собрать wheel в $(WHEELS_DIR)/"
	@echo "make sync                       - установить все пакеты из $(REQUIREMENTS) (из индекса)"
	@echo "make sync-offline               - установить все пакеты из $(REQUIREMENTS) только из $(WHEELS_DIR)/, без обращения к индексу"
	@echo "make freeze                     - перезаписать $(REQUIREMENTS) текущим состоянием окружения"
	@echo "make wheels                     - собрать wheel для всех пакетов из $(REQUIREMENTS)"
	@echo "make clean                      - удалить $(WHEELS_DIR)/"

venv:
	@test -d $(VENV) || python3 -m venv $(VENV)

install: venv
ifeq ($(strip $(PKG)),)
	$(error Укажите пакет: make install <package>, например make install redis)
endif
	$(PIP) install --upgrade $(PKG)
	$(PIP) freeze > $(REQUIREMENTS)
	@mkdir -p $(WHEELS_DIR)
	$(PIP) wheel $(PKG) -w $(WHEELS_DIR)
	@echo "Готово: $(PKG) установлен, $(REQUIREMENTS) обновлён, wheel-пакеты в $(WHEELS_DIR)/"

sync: venv
	$(PIP) install -r $(REQUIREMENTS)

sync-offline: venv
	$(PIP) install --no-index --find-links=$(WHEELS_DIR) -r $(REQUIREMENTS)

freeze: venv
	$(PIP) freeze > $(REQUIREMENTS)

wheels: venv
	@mkdir -p $(WHEELS_DIR)
	$(PIP) wheel -r $(REQUIREMENTS) -w $(WHEELS_DIR)

clean:
	rm -rf $(WHEELS_DIR)

# позволяет передавать имя пакета как аргумент: make install redis
%:
	@:
