.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) clean compile
	@echo "✓ Компиляция завершена"

clean: ## Очистить проект
	@echo "Очистка проекта..."
	@$(REBAR3) clean
	@rm -rf _build deps logs *.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.*
	@pkill -f "beam.*eventhub_test" 2>/dev/null || true
	@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
	@echo "✓ Приложение остановлено"

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

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

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

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

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

test-search-unit: ## Запустить unit-тесты поиска
	@echo "Запуск unit-тестов поиска (logic)..."
	@$(REBAR3) eunit --sname test_search1 --module=logic_search_tests

test-search-handler: ## Запустить handler тесты поиска
	@echo "Запуск handler тестов поиска..."
	@$(REBAR3) eunit --sname test_search2 --module=handler_search_tests

test-api: ## Запустить API тесты (авто-запуск сервера)
	@./test/scripts/run_tests.sh

test-full: ## Полный цикл тестирования
	@./test/scripts/run_tests.sh $(PATTERN)

test-full-search: ## Полный цикл для поиска
	@./test/scripts/run_tests.sh search

test-full-booking: ## Полный цикл для бронирований
	@./test/scripts/run_tests.sh booking

test-api-existing: ## Запустить API тесты на уже работающем сервере
	@chmod +x test/scripts/*.sh
	@cd test/scripts && ./test_runner.sh -s $(PATTERN)

test-server-stop: ## Остановить тестовый сервер
	@pkill -f "beam.*eventhub" 2>/dev/null || true
	@echo "✓ Servers stopped"
	@rm -rf Mnesia.* 2>/dev/null || true

test-runner: ## Запустить тесты с фильтром (make test-runner PATTERN=booking)
	@chmod +x test/scripts/*.sh
	@cd test/scripts && ./test_runner.sh $(PATTERN)

test-quick: ## Запустить тесты используя уже запущенный сервер
	@chmod +x test/scripts/*.sh
	@cd test/scripts && ./test_runner.sh -s $(PATTERN)

test-auth: ## Запустить тесты аутентификации
	@chmod +x test/scripts/test_auth_api.sh
	@./test/scripts/test_auth_api.sh

test-calendar: ## Запустить тесты календарей
	@chmod +x test/scripts/test_calendar_api.sh
	@./test/scripts/test_calendar_api.sh

test-event: ## Запустить тесты событий
	@chmod +x test/scripts/test_event_api.sh
	@./test/scripts/test_event_api.sh

test-booking: ## Запустить тесты бронирований
	@chmod +x test/scripts/test_booking_api.sh
	@./test/scripts/test_booking_api.sh

test-reviews: ## Запустить тесты отзывов
	@chmod +x test/scripts/test_reviews_api.sh
	@./test/scripts/test_reviews_api.sh

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

# ============================================================================
# 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-build: ## Собрать Docker образ
	@echo "Сборка Docker образа..."
	@docker build -t eventhub:latest .
	@echo "✓ Docker образ собран"

docker-run: ## Запустить Docker контейнер
	@echo "Запуск Docker контейнера..."
	@docker run -p 8080:8080 -p 8445:8445 --name eventhub eventhub:latest

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

# ============================================================================
# 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