.PHONY: help clean compile shell test eunit test-api test-all \
        dialyzer xref cover docs release run stop logs

# Цвета для вывода (только для команд, где нужны)
GREEN  := \033[0;32m
YELLOW := \033[1;33m
RED    := \033[0;31m
BLUE   := \033[0;34m
NC     := \033[0m

# Переменные
REBAR3 := rebar3
SNAME  := eventhub
SHELL  := /bin/bash

# ============================================================================
# HELP
# ============================================================================
help: ## Показать это сообщение
	@echo "EventHub - Makefile команды:"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  %-20s %s\n", $$1, $$2}'

# ============================================================================
# BUILD
# ============================================================================
compile: ## Скомпилировать проект
	@echo "Компиляция проекта..."
	@$(REBAR3) compile
	@echo "✓ Компиляция завершена"

clean: ## Очистить проект
	@echo "Очистка проекта..."
	@$(REBAR3) clean
	#@rm -rf _build build/ct_run.* deps logs *.log
	@rm -rf _build logs/ct_run.* deps doc app *.log
	@echo "✓ Очистка завершена"

deps: ## Установить зависимости
	@echo "Установка зависимостей..."
	@$(REBAR3) get-deps
	@echo "✓ Зависимости установлены"

update-deps: ## Обновить зависимости
	@echo "Обновление зависимостей..."
	@$(REBAR3) update-deps
	@echo "✓ Зависимости обновлены"

# ============================================================================
# DEVELOPMENT
# ============================================================================
shell: ## Запустить интерактивную оболочку
	@echo "Запуск Erlang shell..."
	@$(REBAR3) shell --sname $(SNAME)

run: ## Запустить приложение (foreground)
	@echo "Запуск приложения..."
	@$(REBAR3) shell --sname $(SNAME)

test-server: ## Запустить тестовый сервер в фоне
	@echo "Cleaning old data..."
	@rm -rf Mnesia.*
	@echo "Starting server..."
	@$(REBAR3) shell --sname eventhub_test </dev/null > /tmp/eventhub_test.log 2>&1 &
	@echo "PID: $$!"
	@for i in 1 2 3 4 5 6 7 8 9 10; do \
		if curl -s http://localhost:8080/health | grep -q "ok"; then \
			echo "✓ Server ready at http://localhost:8080"; \
			break; \
		fi; \
		sleep 1; \
	done

stop: ## Остановить приложение
	@echo "Остановка приложения..."
	@pkill -f "rebar3 shell --sname $(SNAME)" || true
	@pkill -f "beam.*$(SNAME)" || true
	@pkill -f beam.smp || true
	@echo "✓ Приложение остановлено"

restart: stop run ## Перезапустить приложение

# ============================================================================
# TESTING
# ============================================================================
test: eunit ## Запустить все тесты (алиас для eunit)

eunit: ## Запустить EUnit тесты
	@echo "Запуск EUnit тестов..."
	@$(REBAR3) eunit --sname $(SNAME)_test --verbose

eunit-module: ## Запустить тесты для модуля (make eunit-module MODULE=core_calendar_tests)
	@echo "Запуск тестов для модуля $(MODULE)..."
	@$(REBAR3) eunit --sname $(SNAME)_test --module=$(MODULE) --verbose

eunit-verbose: ## Запустить EUnit тесты с подробным выводом
	@echo "Запуск EUnit тестов (verbose)..."
	@$(REBAR3) eunit --sname $(SNAME)_test --verbose

test-api: ## Запустить Common Test для API
	@echo "Cleaning old data..."
	@rm -rf logs/test/ct/ct_run.*
	@$(REBAR3) ct --sname $(SNAME)_api_test #-v

test-api-remote:
	@CT_MODE=remote API_HOST=http://localhost:8080 WS_HOST=ws://localhost:8081 ADMIN_API_HOST=http://localhost:8445 ADMIN_WS_HOST=ws://localhost:8446 rebar3 ct

test-api-remote-cluster:
	@rm -rf logs/test/ct/ct_run.*
	@CT_MODE=remote \
	API_HOST=https://api.eventhub.local/api \
	WS_HOST=wss://ws.eventhub.local \
	ADMIN_API_HOST=https://admin-api.eventhub.local/api \
	ADMIN_WS_HOST=wss://admin-ws.eventhub.local \
	rebar3 ct

test-api-docker:
	@docker build -t eventhub-tests -f docker/ApiTests.Dockerfile .
	 @docker run --rm \
	   -e CT_MODE=remote \
	   -e "API_HOST=http://eventhub:8080" \
	   -e "ADMIN_API_HOST=http://eventhub:8445" \
	   -e "WS_HOST=ws://eventhub:8081" \
	   -e "ADMIN_WS_HOST=ws://eventhub:8446" \
	   eventhub-tests

test-all: eunit test-api ## Запустить ВСЕ тесты (EUnit + API)
	@echo "========================================"
	@echo "     ВСЕ ТЕСТЫ ПРОЙДЕНЫ!"
	@echo "========================================"

# ============================================================================
# LOAD TESTING
# ============================================================================
tsung-test: ## Запустить нагрузочный тест Tsung
	@echo "Запуск нагрузочного теста Tsung..."
	@mkdir -p logs/tsung
	@tsung -f test/tsung/eventhub_http.xml -l logs/tsung start
	@echo "Отчёт: logs/tsung/*/report.html"

tsung-emulate: ## Запустить нагрузочный тест Tsung
	@rm -rf logs/tsung
	@echo "Запуск нагрузочного теста Tsung..."
	@mkdir -p logs/tsung
	@tsung -f test/tsung/eventhub_tsung.xml -l logs/tsung start
	@echo "Отчёт: http://localhost:8091/ или logs/tsung/*/report.html" # <tsung loglevel="debug" dumptraffic="true" version="1.0">

wrk-register: ## Нагрузочный тест регистрации (wrk2)
	@wrk -t4 -c100 -d30s -t100 -s test/wrk/scripts/wrk_register.lua https://api.eventhub.local/api/v1/register

wrk-search: ## Нагрузочный тест поиска (wrk2)
	@TOKEN=$$(curl -s -X POST https://api.eventhub.local/api/v1/register \
		-H "Content-Type: application/json" \
		-d '{"email":"wrktest@test.com","password":"pass"}' | \
		grep -o '"token":"[^"]*"' | cut -d'"' -f4); \
	wrk -t4 -c100 -d30s -t200 \
		-H "Authorization: Bearer $$TOKEN" \
		https://api.eventhub.local/api/v1/search?type=event\&q=test

eventhub-emulator:
	@docker run --rm --network host \
	  -e ADMIN_API_HOST="http://localhost:8445" \
	  -e CLIENT_API_HOST="http://localhost:8080" \
	  -e ADMIN_EMAIL="superadmin@eventhub.local" \
	  -e ADMIN_PASSWORD="123456" \
	  -e BOT_PASSWORD="botpass123" \
	  -e MIN_DELAY=0.5 \
	  -e MAX_DELAY=3.0 \
	  -e LOOP_FOREVER=true \
	  -e BOT_REFRESH_INTERVAL=300 \
	  eventhub-emulator

curl-health:
	for i in {1..2}; do curl -k -s -o /dev/null -w "%{http_code}\n" -H "Host: api.eventhub.local" https://localhost/api/health; done

wrk-health: ## Нагрузочный тест health (wrk2)
	wrk -t4 -c100 -d30s -t100 \
		-H "Host: api.eventhub.local" \
		https://api.eventhub.local/api/health

# ============================================================================
# CODE QUALITY
# ============================================================================
dialyzer: ## Запустить Dialyzer (статический анализ)
	@echo "Запуск Dialyzer..."
	@$(REBAR3) dialyzer
	@echo "✓ Dialyzer завершён"

xref: ## Запустить Xref (кросс-ссылки)
	@echo "Запуск Xref..."
	@$(REBAR3) xref
	@echo "✓ Xref завершён"

cover: ## Запустить тесты с покрытием кода
	@echo "Запуск тестов с покрытием..."
	@$(REBAR3) eunit --sname $(SNAME)_test --cover
	@$(REBAR3) cover --verbose
	@echo "✓ Отчёт о покрытии в _build/test/cover/"

docs: ## Сгенерировать документацию (EDoc)
	@echo "Генерация документации..."
	@$(REBAR3) edoc
	@echo "✓ Документация в doc/"

# ============================================================================
# RELEASE & DOCKER
# ============================================================================
release: ## Собрать релиз
	@echo "Сборка релиза..."
	@$(REBAR3) as prod release
	@echo "✓ Релиз собран в _build/prod/rel/eventhub/"

# ============================================================================
# DOCKER
# ============================================================================
docker-build: ## Собрать Docker образ
	@echo "Сборка Docker образа..."
	@docker build -f docker/Dockerfile -t eventhub:latest .
	@echo "✅ Docker образ собран"

docker-build-debug: ## Собрать Docker образ
	@echo "Сборка Docker образа..."
	@docker build -f docker/Debug.Dockerfile -t eventhub-debug:latest .
	@echo "✅ Docker образ собран"


docker-run: ## Запустить Docker контейнер (одиночный)
	@echo "Запуск Docker контейнера..."
	@docker run -d \
	  --hostname eventhub.local \
	  --env-file docker/.env \
	  --name eventhub \
	  -e NODE_NAME=eventhub@eventhub.local \
	  -p 8080:8080 \
	  -p 8081:8081 \
	  -p 8445:8445 \
	  -p 8446:8446 \
	  -v eventhub-data:/app/data \
	  eventhub:latest
	@echo "✅ Контейнер запущен на http://localhost:8080"

docker-stop: ## Остановить Docker контейнер
	@echo "Остановка Docker контейнера..."
	@docker stop eventhub 2>/dev/null || true
	@docker rm eventhub 2>/dev/null || true
	@echo "✅ Контейнер остановлен"

docker-logs: ## Показать логи Docker контейнера
	@docker logs -f eventhub

docker-shell: ## Зайти в Docker контейнер
	@docker exec -it eventhub sh

docker-compose-build-app: ## Собрать Docker образ
	@echo "Сборка Docker образа..."
	@docker-compose -f docker/docker-compose.yml build --no-cache eventhub-node1 eventhub-node2 eventhub-node3
	@echo "✅ Docker образ собран"

docker-compose-up: ## Запустить кластер (3 ноды)
	@echo "Запуск кластера EventHub (3 ноды)..."
	@docker-compose -f docker/docker-compose.yml --env-file docker/.env up -d
	@echo "✅ Кластер запущен"
	@echo "Node 1: http://localhost:8080"
	@echo "Node 2: http://localhost:8082"
	@echo "Node 3: http://localhost:8084"
	@echo "Prometheus: http://localhost:9090"
	@echo "Grafana: http://localhost:3000"
	@echo "ObserverWeb: http://localhost:4000/observer/"
	@echo "Traefik: http://localhost:8080"
	@echo "LogLynx: http://localhost:6123"
	@echo "Swagger UI: http://localhost:8447"

docker-compose-down: ## Остановить кластер
	@echo "Остановка кластера..."
	@docker-compose -f docker/docker-compose.yml --env-file docker/.env down
	@echo "✅ Кластер остановлен"

docker-compose-logs: ## Показать логи кластера
	@docker-compose -f docker/docker-compose.yml --env-file docker/.env logs -f

docker-clean: docker-stop ## Очистить Docker образы и volumes
	@docker rmi eventhub:latest 2>/dev/null || true
	@docker volume rm eventhub-data 2>/dev/null || true
	@echo "✅ Docker очищен"

docker-swarm-deploy: ## Запустить кластер
	@set RELEASE_COOKIE=$$(grep RELEASE_COOKIE docker/.env | cut -d '=' -f2)
	@set JWT_SECRET=$$(grep JWT_SECRET docker/.env | cut -d '=' -f2)
	@docker stack deploy -c docker/docker-compose.swarm.yml eventhub --detach=true
	@echo "✅ Кластер запущен"

docker-swarm-stop: ## Запустить кластер
	@docker stack rm eventhub
	##@docker volume prune -f
	@echo "✅ Кластер удален"

docker-swarm-scale: ## Изменить количество реплик (например, make scale REPLICAS=5)
	@echo "Масштабирование до ${REPLICAS} реплик..."
	docker service scale eventhub_eventhub=${REPLICAS}
	@echo "✅ Сервис масштабирован"

docker-swarm-status: ## Показать состояние кластера
	@echo "Количество узлов в кластере:"
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'length(nodes()).'
	@echo "Список узлов:"
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'nodes().'
	@echo "Список узлов Mnesia:"
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'mnesia:table_info(user, disc_copies).'

docker-swarm-reg-admin:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'core_admin:create(<<"admin">>,<<"123456">>,superadmin).'

docker-swarm-check-admin:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'eventhub_auth:authenticate_admin_request(<<"">>,<<"admin@eventhub.local">>,<<"123456">>).'

docker-swarm-reg-bots:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval "os:putenv(\"BOT_COUNT\", \"3000\"), bot_controller:register()."

docker-swarm-reg-bots-stop:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'bot_controller:stop().'

docker-swarm-delete-bots:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub eval 'bot_controller:delete().'

docker-swarm-count-bots:
	@for id in $$(docker ps -qf "name=eventhub_eventhub"); do \
		echo "=== $$id ==="; \
		docker exec $$id /app/bin/eventhub eval 'bot_controller:count_bots().'; \
	done

docker-swarm-shell:
	@docker exec $$(docker ps -qf "name=eventhub_eventhub" | head -n 1) /app/bin/eventhub remote_console


# ============================================================================
# UTILITIES
# ============================================================================
status: ## Проверить статус сервера
	@echo "Проверка статуса сервера..."
	@if curl -s http://localhost:8080/health > /dev/null 2>&1; then \
		echo "✓ Сервер запущен на http://localhost:8080"; \
		curl -s http://localhost:8080/health; \
	else \
		echo "✗ Сервер не запущен"; \
	fi

tree: ## Показать структуру проекта
	@tree -I '_build|deps|logs|.git' --dirsfirst 2>/dev/null || ls -la

info: ## Показать информацию о проекте
	@echo "EventHub - информация о проекте:"
	@echo ""
	@echo "API эндпоинты:"
	@echo "  POST   /v1/register          - Регистрация"
	@echo "  POST   /v1/login             - Логин"
	@echo "  POST   /v1/refresh           - Обновление токена"
	@echo "  GET    /v1/user/me           - Профиль"
	@echo "  POST   /v1/calendars         - Создание календаря"
	@echo "  GET    /v1/calendars         - Список календарей"
	@echo "  POST   /v1/calendars/:id/events - Создание события"
	@echo "  POST   /v1/events/:id/bookings  - Запись на событие"
	@echo ""
	@echo "Порты:"
	@echo "  HTTP API:    8080"
	@echo "  Admin HTTP:  8445"

# ============================================================================
# DEVELOPMENT WORKFLOW
# ============================================================================
dev-setup: deps compile ## Настроить окружение для разработки
	@echo "✓ Окружение настроено"

dev-test: ## Быстрый цикл: compile + eunit
	@make compile
	@make eunit

# ============================================================================
# GIT HELPERS
# ============================================================================
git-status: ## Показать статус Git
	@git status --short

git-log: ## Показать лог Git (последние 10)
	@git log --oneline -10

git-save: ## Сохранить изменения (commit + push)
	@read -p "Сообщение коммита: " msg; \
	git add .; \
	git commit -m "$$msg"; \
	git push

# ============================================================================
# DEFAULT
# ============================================================================
.DEFAULT_GOAL := help