# Команды разработки scan-gateway. Запуск из корня репозитория; рецепты сами переходят в api/ (как и в arm-core),
# поэтому backend-команды работают с каталогом api/ и окружением api/.venv.
VENV := api/.venv
BIN := $(CURDIR)/$(VENV)/bin
# docs/dev — соседний репозиторий и в основном workspace, и в worktree .wt/<срез>/
COMPOSE_FILE ?= ../docs/dev/docker-compose.yml
COMPOSE_PROJECT ?= arm-ka
IMAGE ?= scan-gateway:dev
ARM_KA_DOCS ?= ../docs

.PHONY: help venv lint test test-integration check docker-build check-full statements-check up emulator golden-update

help:
	@echo "venv             - окружение api/.venv (Python 3.11) с зависимостями без raisa_*"
	@echo "lint             - ruff check, ruff format --check, mypy src arm_statements"
	@echo "test             - pytest без интеграционных тестов"
	@echo "test-integration - интеграционные тесты (нужны NATS и MinIO: make up)"
	@echo "check            - lint + test"
	@echo "docker-build     - собрать docker-образ $(IMAGE) (контекст — корень репозитория)"
	@echo "check-full       - check + test-integration + docker-build (по порядку, до первой ошибки)"
	@echo "statements-check - свежесть копии api/arm_statements (sync-statements --check), входит в check-full"
	@echo "up               - поднять NATS/MinIO/PostgreSQL общим compose-проектом arm-ka и создать бакет (minio-init)"
	@echo "emulator         - запустить эмулятор ИС Сканирование (python -m src.scan_emulator)"
	@echo "golden-update    - пересобрать эталоны нормализатора ../fixtures/ocr/expected_normalize/ (diff смотреть в fixtures)"

# Python 3.11 (версия платформы); внутренние пакеты raisa_* вне банка недоступны — пропускаем их
venv:
	cd api && uv venv --python 3.11 --allow-existing .venv
	cd api && grep -v '^raisa_' 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 -

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

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

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

check: lint test

# Образ собирается без Nexus (raisa_* в образ не ставятся, см. Dockerfile). Тесты в образе не запускаются:
# tests/ в нём есть, но api/.env.test исключён через .dockerignore, поэтому pytest внутри контейнера не пройдёт.
docker-build:
	docker build -t $(IMAGE) .

# Полная проверка перед PR. Шаги вызываются последовательно через $(MAKE), а не как пререквизиты:
# так порядок check -> test-integration -> docker-build и остановка на первой ошибке гарантированы и при make -j.
check-full:
	$(MAKE) check
	$(MAKE) statements-check
	$(MAKE) test-integration
	$(MAKE) docker-build

# Общий compose-проект workspace (arm-ka): его используют и другие сервисы, поэтому целей down/stop/restart нет.
# --wait — только со списком долгоживущих сервисов: одноразовый minio-init завершается кодом 0, и compose считает это сбоем.
# Поэтому бакет создаётся отдельным шагом: `run --rm minio-init` (идемпотентно: `mc mb --ignore-existing`; на свежем
# томе без него интеграционные тесты падают на NoSuchBucket). Код выхода шага пробрасывается в make.
up:
	docker compose -f $(COMPOSE_FILE) --project-name $(COMPOSE_PROJECT) up -d --wait postgres nats minio
	docker compose -f $(COMPOSE_FILE) --project-name $(COMPOSE_PROJECT) run --rm minio-init

# Эмулятор ИС Сканирование (параметры — SCAN_HOTFOLDER_PATH, SCAN_FIXTURES_DIR, SCAN_EMULATOR_DELAY из api/.env)
emulator:
	cd api && $(BIN)/python -m src.scan_emulator

# Эталоны нормализатора на реальных ответах ИС: пишет ../fixtures/ocr/expected_normalize/<name>.json; diff смотреть в fixtures
golden-update:
	cd api && $(BIN)/python -m tests.golden_update

# Свежесть копии api/arm_statements/ (../docs/dev/checks.md): 0 — синхронна; 10 — отстала или перечень кодов в docs
# новее (цель зелёная, предупреждение вписать в описание PR); 20 и 2 — красная. Читает ../docs и ../arm-statements,
# поэтому только в check-full, не в check
statements-check:
	@rc=0; $(ARM_KA_DOCS)/scripts/sync-statements.sh --check --host-dir . || rc=$$?; \
	if [ $$rc -eq 10 ]; then echo "statements-check: ПРЕДУПРЕЖДЕНИЕ — впишите в описание PR"; \
	elif [ $$rc -ne 0 ]; then exit $$rc; fi
