VENV := .venv
PYTHON := $(VENV)/bin/python
PIP := $(VENV)/bin/pip
WHEELS_DIR := wheels
REQUIREMENTS := requirements.txt
MANAGE := cd src/ && ../$(PYTHON) manage.py

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 dj_makemigrations dj_migrate dj_superuser dj_run dj_test dj_startapp tg_run

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
	echo $(PKG)
	$(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
%:
	@:

dj_makemigrations:
	$(MANAGE) makemigrations

dj_migrate:
	$(MANAGE) migrate

dj_superuser:
	$(MANAGE) createsuperuser

dj_run:
	$(MANAGE) runserver

dj_test:
	$(MANAGE) test

dj_startapp:
	$(MANAGE) startapp $(app)

tg_run:
	$(MANAGE) telegram_run
