.PHONY: up down clean ddl data transform logs \
        generated-history-analytics generated-history-check \
        startup-history-export startup-history-import startup-history-check \
        reload-monitoring recover-monitoring \
        superset-init superset-dashboard superset-ui superset-restart \
        generator-up generator-down generator-logs generator-restart \
        generator-test generator-test-build generator-test-cov

COMPOSE ?= docker compose

# ============================================================================
# Основные команды
# ============================================================================

up:
	$(COMPOSE) up -d

# Остановить и удалить контейнеры/сети текущего проекта
down:
	$(COMPOSE) down

# Полная очистка окружения проекта (включая volumes)
clean:
	$(COMPOSE) down -v --remove-orphans

logs:
	$(COMPOSE) logs -f --tail=200 $(service)

# ============================================================================
# ETL Pipeline
# ============================================================================

ddl:
	bash ./scripts/apply_clickhouse_ddl.sh

data:
	bash ./scripts/load_kafka_data.sh

transform:
	bash ./scripts/run_batch.sh

# Чистый аналитический прогон: стартовая история генератора -> STG -> ODS -> DDS -> DM -> Superset
generated-history-analytics:
	COMPOSE_BIN="$(COMPOSE)" bash ./scripts/run_generated_history_analytics.sh

# Повторяемая проверка после прогона стартовой истории
generated-history-check:
	COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_generated_analytics.sh

# Сгенерировать стартовую историю и сохранить портативный артефакт
startup-history-export:
	COMPOSE_BIN="$(COMPOSE)" bash ./scripts/export_startup_history_artifact.sh

# Воспроизвести портативный артефакт стартовой истории в Kafka
startup-history-import:
	COMPOSE_BIN="$(COMPOSE)" bash ./scripts/import_startup_history_artifact.sh

# Сверить ClickHouse после импорта с manifest артефакта
startup-history-check:
	COMPOSE_BIN="$(COMPOSE)" bash ./scripts/check_startup_history_manifest.sh

# Перезагрузка конфигурации мониторинга (после изменений в provisioning)
reload-monitoring:
	@echo "=== Перезагрузка сервисов мониторинга ==="
	$(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter
	$(COMPOSE) restart prometheus statsd-exporter
	@echo "=== Перезагрузка provisioning Grafana ==="
	@sleep 2
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]"
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]"
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]"
	@echo "=== Проверка ==="
	@curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq

# Восстановление мониторинга после сбоев (например, out of bounds / пустые дашборды)
recover-monitoring:
	@echo "=== Восстановление мониторинга (жесткий режим) ==="
	$(COMPOSE) rm -sf prometheus statsd-exporter
	$(COMPOSE) up -d prometheus grafana kafka-exporter statsd-exporter
	$(COMPOSE) restart airflow-scheduler airflow-webserver
	@echo "=== Перезагрузка provisioning Grafana ==="
	@sleep 2
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload && echo " [datasources]"
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload && echo " [dashboards]"
	@curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload && echo " [alerting]"
	@echo "=== Проверка targets ==="
	@curl -s http://localhost:9090/api/v1/targets | grep -o '"job":"[^"]*"' | sort | uniq
	@curl -s http://localhost:9090/api/v1/targets | grep -o '"health":"[^"]*"' | sort | uniq -c

# ============================================================================
# Superset команды
# ============================================================================

# Инициализация Superset (подключение к ClickHouse + датасеты)
superset-init:
	$(COMPOSE) up -d postgres-metadata clickhouse
	$(COMPOSE) up --abort-on-container-exit --exit-code-from superset-init superset-init
	$(COMPOSE) up -d --no-deps superset

# Создание дашборда с чартами
superset-dashboard:
	$(COMPOSE) exec -T superset bash -c "python /app/superset_init/create_dashboard.py"

# Открыть Superset UI
superset-ui:
	@echo "Superset доступен по адресу: http://localhost:8088"
	@echo "Логин: admin / Пароль: admin"

# Перезапуск Superset
superset-restart:
	$(COMPOSE) restart superset

# ============================================================================
# Генератор событий (автономный стриминг)
# ============================================================================

# Запустить только генератор (полезно для отладки)
generator-up:
	$(COMPOSE) up -d --build generator

# Остановить генератор
generator-down:
	$(COMPOSE) stop generator

# Логи генератора
generator-logs:
	$(COMPOSE) logs -f --tail=100 generator

# Перезапуск генератора с пересборкой
generator-restart:
	$(COMPOSE) up -d --build --force-recreate generator

# Собрать тестовый образ генератора
generator-test-build:
	cd generator && docker build -t generator:test .

# Запустить тесты генератора (pytest)
generator-test: generator-test-build
	@echo "=== Запуск тестов генератора ==="
	docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ -v

# Запустить тесты с покрытием
generator-test-cov: generator-test-build
	@echo "=== Запуск тестов с покрытием ==="
	docker run --rm -v $(PWD):/workspace -w /workspace/generator generator:test pytest tests/ -v --cov=. --cov-report=term-missing
