.PHONY: dev build migrate logs shell-api shell-gpu lint test down ps restart clean test-up test-down test-logs test-ps

# ─── Переменные ────────────────────────────────────────────────────────────────
# Прод: docker-compose.prod.yml — app-сервисы + локальный ES, остальная инфра
#       (postgres/redis/rabbitmq/minio/ollama) уже существует и берётся из .env.
# Dev (полностью локальный sandbox, свои postgres/redis/rabbitmq/minio/ollama +
#       hot reload) — поверх self-hosted примера, используется редко.
# Test (то, что реально гоняется на машине разработчика день в день) — hot
#       reload против той же общей инфры, что и прод.
COMPOSE_PROD     = docker compose -f docker-compose.prod.yml
COMPOSE_DEV      = docker compose -f docker-compose.selfhosted.yml.example -f docker-compose.dev.yml
COMPOSE_TEST     = docker compose -f docker-compose.test.yml
PROJECT          = anti-plagiarism

# ─── Разработка (полностью локальный sandbox, редко используется) ─────────────
dev:
	@cp -n .env.example .env 2>/dev/null || true
	$(COMPOSE_DEV) up --build

dev-d:
	@cp -n .env.example .env 2>/dev/null || true
	$(COMPOSE_DEV) up --build -d

# ─── Test (hot reload против общей инфры — повседневная разработка) ──────────
test-up:
	$(COMPOSE_TEST) up --build -d

test-down:
	$(COMPOSE_TEST) down

test-logs:
	$(COMPOSE_TEST) logs -f

test-ps:
	$(COMPOSE_TEST) ps

# ─── Продакшн ─────────────────────────────────────────────────────────────────
build:
	$(COMPOSE_PROD) build

up:
	$(COMPOSE_PROD) up -d

down:
	$(COMPOSE_PROD) down

restart:
	$(COMPOSE_PROD) restart

ps:
	$(COMPOSE_PROD) ps

# ─── Миграции ─────────────────────────────────────────────────────────────────
migrate:
	$(COMPOSE_PROD) exec api alembic upgrade head

migrate-dev:
	$(COMPOSE_DEV) exec api alembic upgrade head

makemigration:
	@read -p "Migration name: " name; \
	$(COMPOSE_PROD) exec api alembic revision --autogenerate -m "$$name"

downgrade:
	$(COMPOSE_PROD) exec api alembic downgrade -1

# ─── Логи ─────────────────────────────────────────────────────────────────────
logs:
	$(COMPOSE_PROD) logs -f

logs-api:
	$(COMPOSE_PROD) logs -f api

logs-gpu:
	$(COMPOSE_PROD) logs -f worker-gpu

logs-indexer:
	$(COMPOSE_PROD) logs -f worker-indexer

logs-notifier:
	$(COMPOSE_PROD) logs -f worker-notifier

logs-gost:
	$(COMPOSE_PROD) logs -f worker-gost

# ─── Шеллы ────────────────────────────────────────────────────────────────────
shell-api:
	$(COMPOSE_PROD) exec api bash

shell-gpu:
	$(COMPOSE_PROD) exec worker-gpu bash

shell-indexer:
	$(COMPOSE_PROD) exec worker-indexer bash

shell-db:
	@echo "Postgres общий (192.168.1.11) — подключайся напрямую: psql -h 192.168.1.11 -U antiplagiator antiplagiator"

shell-redis:
	@echo "Redis общий (192.168.1.19) — подключайся напрямую: redis-cli -h 192.168.1.19 -n 3"

# ─── Линтинг и тесты ──────────────────────────────────────────────────────────
lint:
	$(COMPOSE_PROD) exec api ruff check . --fix
	$(COMPOSE_PROD) exec api mypy app/

lint-frontend:
	cd services/frontend && npm run lint

test:
	$(COMPOSE_PROD) exec api pytest tests/ -v

test-cov:
	$(COMPOSE_PROD) exec api pytest tests/ -v --cov=app --cov-report=html

# ─── Утилиты ──────────────────────────────────────────────────────────────────
# ВНИМАНИЕ: -v удаляет только ЛОКАЛЬНЫЕ volume (es_prod_data, faiss_index_prod) —
# общие postgres/redis/rabbitmq/minio не в Compose, их не затронет.
clean:
	$(COMPOSE_PROD) down -v --remove-orphans
	docker system prune -f

# Запустить парсер (пример: make parse PARSER=openalex ARGS="--limit 1000")
parse:
	$(COMPOSE_PROD) exec api python /scripts/run_parser.py $(PARSER) $(ARGS)

# Создать MinIO бакеты (запускать один раз на общем MinIO 192.168.1.21, не локально)
minio-init:
	@echo "MinIO общий (192.168.1.21) — бакеты documents/backups создаются на нём, см. .env MINIO_*"

# Создать ES индекс
es-init:
	bash infra/elasticsearch/setup.sh

# Статистика Celery
flower:
	@echo "Flower доступен по адресу http://localhost:5555"
	@$(COMPOSE_PROD) ps flower

help:
	@echo "Академический помощник — команды make:"
	@echo ""
	@echo "  make test-up      — запустить тестовый стек (hot reload, общая инфра)"
	@echo "  make dev          — запустить полностью локальный sandbox (редко нужно)"
	@echo "  make build        — собрать прод-образы"
	@echo "  make up           — запустить в продакшн режиме"
	@echo "  make down         — остановить все сервисы"
	@echo "  make migrate      — применить миграции Alembic"
	@echo "  make logs         — показать логи всех сервисов"
	@echo "  make shell-api    — открыть shell в контейнере api"
	@echo "  make lint         — запустить линтер"
	@echo "  make test         — запустить тесты"
	@echo "  make clean        — удалить прод-контейнеры и ЛОКАЛЬНЫЕ volume"
