# Команды разработки tabular-parser. Backend — api/.venv; запуск из корня репозитория.
VENV := api/.venv
BIN := $(CURDIR)/$(VENV)/bin
STATEMENTS_DIR ?= ../pylib_ai_arm_statements
STATEMENTS_TAG ?= v0.1.1
COMPOSE_FILE ?= ../docs/dev/docker-compose.yml

.PHONY: venv install lint test test-integration test-fixtures golden-update golden-check check docker-build check-full up

# Python 3.11; пропускаем внутренние raisa_* и устанавливаемые локально pylib_ai*
venv:
	cd api && uv venv --python 3.11 --allow-existing .venv
	cd api && grep -Ev '^(raisa_|pylib_ai)' requirements.txt | uv pip install --python .venv/bin/python -r -
	cd api && grep -v '^-r' requirements-dev.txt | uv pip install --python .venv/bin/python -r -
	uv pip install --python "$(BIN)/python" --reinstall-package pylib-ai-arm-statements "$(STATEMENTS_DIR)"

# Установить или переустановить библиотеку в окружение backend.
install:
	uv venv --python 3.11 --allow-existing "$(VENV)"
	uv pip install --python "$(BIN)/python" --reinstall-package pylib-ai-arm-statements "$(STATEMENTS_DIR)"

lint:
	cd api && $(BIN)/ruff check .
	cd api && $(BIN)/ruff format --check .
	cd api && $(BIN)/mypy src

test:
	cd api && $(BIN)/pytest -m "not integration"

test-integration:
	cd api && $(BIN)/pytest -m integration

# Тесты на реальных данных из ../fixtures (ARM_KA_FIXTURES): golden-снимки, покрытие словарей, property-тест
test-fixtures:
	cd api && $(BIN)/pytest -m fixtures

# Golden-снимки разбора ОСВ: перезапись в ../fixtures/golden/expected_osv_parse/ + unified diff изменившихся.
# Результат обязательно просмотреть и коммитить в репозиторий fixtures отдельным коммитом (снимок — регрессия, не оракул)
golden-update:
	cd api && ENV_FILE=.env.test $(BIN)/python scripts/golden_update.py

# То же без записи: код возврата 1, если снимки расходятся с разбором
golden-check:
	cd api && ENV_FILE=.env.test $(BIN)/python scripts/golden_update.py --check

check: lint test

# Сборка образа из корня репозитория
docker-build:
	@release=$$(git -C "$(STATEMENTS_DIR)" rev-parse --verify "refs/tags/$(STATEMENTS_TAG)^{commit}") || \
		{ echo "Ошибка: в библиотеке отсутствует тег $(STATEMENTS_TAG); выполните git fetch --tags в $(STATEMENTS_DIR)" >&2; exit 1; }; \
	head=$$(git -C "$(STATEMENTS_DIR)" rev-parse HEAD) || exit 1; \
	[ "$$head" = "$$release" ] || \
		{ echo "Ошибка: HEAD библиотеки не совпадает с $(STATEMENTS_TAG)" >&2; exit 1; }
	docker build --build-context "statements=$(STATEMENTS_DIR)" -t tabular-parser .

# Полная проверка перед PR: быстрые проверки, затем NATS/MinIO из compose (make up), затем образ
check-full: check test-integration docker-build

# Только инфраструктура, нужная сервису (без arm-core): NATS и MinIO; postgres — для общей среды compose
up:
	docker compose -f $(COMPOSE_FILE) up -d --wait postgres nats minio
