.ONESHELL:
# Makefile для LogBoard+
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

.PHONY: help setup build up down restart logs clean status ps shell release release-compose

# Переменные
COMPOSE_FILE = docker-compose.yml
SERVICE_NAME = logboard
COMPOSE_PROD_FILE = docker-compose-prod.yaml
PLATFORMS ?= linux/amd64,linux/arm64

# Цвета для вывода
GREEN = \033[0;32m
YELLOW = \033[1;33m
RED = \033[0;31m
NC = \033[0m # No Color

help: ## Показать справку по командам
	@echo "$(GREEN)LogBoard+ - Команды управления$(NC)"
	@echo ""
	@echo "$(YELLOW)Основные команды:$(NC)"
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  $(GREEN)%-15s$(NC) %s\n", $$1, $$2}'
	@echo ""
	@echo "$(YELLOW)Примеры использования:$(NC)"
	@echo "  make setup    # Настроить переменные окружения"
	@echo "  make build    # Собрать образ"
	@echo "  make up       # Запустить сервисы"
	@echo "  make down     # Остановить сервисы"
	@echo "  make restart  # Перезапустить сервисы"
	@echo "  make logs     # Показать логи"

setup: ## Настроить переменные окружения (копировать env.example в .env)
	@echo "$(GREEN)Настройка переменных окружения...$(NC)"
	@if [ ! -f .env ]; then \
		cp env.example .env; \
		echo "$(GREEN)Файл .env создан из env.example$(NC)"; \
		echo "$(YELLOW)Не забудьте отредактировать .env под свои нужды!$(NC)"; \
		echo "$(YELLOW)Особенно важны переменные безопасности:$(NC)"; \
		echo "$(YELLOW)  - LOGBOARD_PASS$(NC)"; \
		echo "$(YELLOW)  - SECRET_KEY$(NC)"; \
		echo "$(YELLOW)  - ENCRYPTION_KEY$(NC)"; \
	else \
		echo "$(YELLOW)Файл .env уже существует.$(NC)"; \
		echo "$(YELLOW)Для пересоздания удалите .env и запустите make setup$(NC)"; \
	fi

build: ## Собрать Docker образ
	@echo "$(GREEN)Сборка Docker образа...$(NC)"
	docker compose -f $(COMPOSE_FILE) build --no-cache
	@echo "$(GREEN)Образ собран успешно!$(NC)"

up: ## Запустить сервисы в фоновом режиме (с правами root)
	@echo "$(GREEN)Запуск сервисов с правами root...$(NC)"
	@mkdir -p snapshots
	docker compose -f $(COMPOSE_FILE) up -d
	@echo "$(GREEN)Сервисы запущены с правами root!$(NC)"
	@if [ -f .env ]; then \
		PORT=$$(grep "^LOGBOARD_PORT=" .env | cut -d'=' -f2 || echo "9001"); \
		echo "$(YELLOW)Приложение доступно по адресу: http://localhost:$$PORT$(NC)"; \
	else \
		echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"; \
	fi

down: ## Остановить и удалить сервисы (с правами root)
	@echo "$(YELLOW)Остановка сервисов с правами root...$(NC)"
	docker compose -f $(COMPOSE_FILE) down
	@echo "$(GREEN)Сервисы с правами root остановлены!$(NC)"

restart: ## Перезапустить сервисы (с правами root)
	@echo "$(YELLOW)Перезапуск сервисов с правами root...$(NC)"
	docker compose -f $(COMPOSE_FILE) restart
	@echo "$(GREEN)Сервисы с правами root перезапущены!$(NC)"

logs: ## Показать логи сервисов
	@echo "$(GREEN)Логи сервисов:$(NC)"
	docker compose -f $(COMPOSE_FILE) logs -f

clean: ## Остановить сервисы и удалить образы
	@echo "$(RED)Очистка проекта...$(NC)"
	docker compose -f $(COMPOSE_FILE) down --rmi all --volumes --remove-orphans
	@echo "$(GREEN)Очистка завершена!$(NC)"

status: ## Показать статус сервисов
	@echo "$(GREEN)Статус сервисов:$(NC)"
	docker compose -f $(COMPOSE_FILE) ps

ps: status ## Алиас для команды status

shell: ## Подключиться к контейнеру сервиса
	@echo "$(GREEN)Подключение к контейнеру $(SERVICE_NAME)...$(NC)"
	docker compose -f $(COMPOSE_FILE) exec $(SERVICE_NAME) /bin/bash

start: up ## Алиас для команды up

stop: down ## Алиас для команды down

rebuild: ## Пересобрать и запустить сервисы
	@echo "$(YELLOW)Пересборка и запуск сервисов...$(NC)"
	docker compose -f $(COMPOSE_FILE) down
	docker compose -f $(COMPOSE_FILE) build --no-cache
	@mkdir -p snapshots
	docker compose -f $(COMPOSE_FILE) up -d
	@echo "$(GREEN)Сервисы пересобраны и запущены!$(NC)"
	@if [ -f .env ]; then \
		PORT=$$(grep "^LOGBOARD_PORT=" .env | cut -d'=' -f2 || echo "9001"); \
		echo "$(YELLOW)Приложение доступно по адресу: http://localhost:$$PORT$(NC)"; \
	else \
		echo "$(YELLOW)Приложение доступно по адресу: http://localhost:9001$(NC)"; \
	fi

config: ## Показать конфигурацию с подставленными переменными окружения
	@echo "$(GREEN)Конфигурация Docker Compose с переменными окружения:$(NC)"
	docker compose -f $(COMPOSE_FILE) config

validate: ## Проверить синтаксис docker-compose.yml
	@echo "$(GREEN)Проверка синтаксиса docker-compose.yml...$(NC)"
	docker compose -f $(COMPOSE_FILE) config --quiet
	@echo "$(GREEN)Синтаксис корректен!$(NC)"

env-check: ## Проверить переменные окружения
	@echo "$(GREEN)Проверка переменных окружения...$(NC)"
	@if [ -f .env ]; then \
		echo "$(GREEN)Файл .env найден$(NC)"; \
		echo "$(YELLOW)Основные переменные:$(NC)"; \
		grep -E "^(LOGBOARD_PORT|LOGBOARD_USER|LOGBOARD_PASS|SECRET_KEY|ENCRYPTION_KEY|DEBUG_MODE)=" .env || echo "$(RED)Переменные не найдены$(NC)"; \
	else \
		echo "$(RED)Файл .env не найден. Запустите make setup$(NC)"; \
	fi

debug-on: ## Включить режим отладки
	@echo "$(GREEN)Включение режима отладки...$(NC)"
	@if [ -f .env ]; then \
		sed -i 's/^DEBUG_MODE=.*/DEBUG_MODE=true/' .env; \
		echo "$(GREEN)Режим отладки включен!$(NC)"; \
		echo "$(YELLOW)Перезапустите сервисы: make restart$(NC)"; \
	else \
		echo "$(RED)Файл .env не найден. Запустите make setup$(NC)"; \
	fi

debug-off: ## Выключить режим отладки
	@echo "$(GREEN)Выключение режима отладки...$(NC)"
	@if [ -f .env ]; then \
		sed -i 's/^DEBUG_MODE=.*/DEBUG_MODE=false/' .env; \
		echo "$(GREEN)Режим отладки выключен!$(NC)"; \
		echo "$(YELLOW)Перезапустите сервисы: make restart$(NC)"; \
	else \
		echo "$(RED)Файл .env не найден. Запустите make setup$(NC)"; \
	fi

debug-status: ## Показать статус режима отладки
	@echo "$(GREEN)Статус режима отладки:$(NC)"
	@if [ -f .env ]; then \
		DEBUG_MODE=$$(grep "^DEBUG_MODE=" .env | cut -d'=' -f2 || echo "false"); \
		if [ "$$DEBUG_MODE" = "true" ]; then \
			echo "$(GREEN)DEBUG_MODE: ВКЛЮЧЕН$(NC)"; \
			echo "$(YELLOW)Доступны:$(NC)"; \
			echo "$(YELLOW)  - Auto-reload при изменении кода$(NC)"; \
			echo "$(YELLOW)  - Swagger UI: /docs$(NC)"; \
			echo "$(YELLOW)  - ReDoc: /redoc$(NC)"; \
		else \
			echo "$(RED)DEBUG_MODE: ВЫКЛЮЧЕН$(NC)"; \
			echo "$(YELLOW)Продакшен режим$(NC)"; \
		fi; \
	else \
		echo "$(RED)Файл .env не найден$(NC)"; \
	fi



# -----------------------------------------------------------------------------
# release: Сборка и публикация образа в Docker Registry + генерация compose для продакшена
# Описание:
#   - Запрашивает реестр, логин и пароль
#   - Собирает образ, тегирует и пушит
#   - Генерирует файл $(COMPOSE_PROD_FILE) для запуска в продакшене
# Пример:
#   make release
# -----------------------------------------------------------------------------
release: ## Собрать, залогиниться, запушить образ и сгенерировать docker-compose-prod.yaml
	@echo "$(GREEN)Release: сборка и публикация образа$(NC)"
	@python3 release/publish_image.py --platforms "$(PLATFORMS)"

# -----------------------------------------------------------------------------
# release-compose: Генерация docker-compose-prod.yaml с подстановкой переменных
# -----------------------------------------------------------------------------
release-compose: ## Сгенерировать docker-compose-prod.yaml с переменными
	@echo "$(YELLOW)Генерация файла $(COMPOSE_PROD_FILE) для продакшена...$(NC)"
	@python3 release/generate_compose.py --env env.example --template release/docker-compose-prod.tmpl.yaml --output $(COMPOSE_PROD_FILE)


