.PHONY: build clean run test install help

# Переменные
BINARY_NAME=vpn-client
BINARY_UNIX=$(BINARY_NAME)
BINARY_WINDOWS=$(BINARY_NAME).exe
GO=go
GOFLAGS=-ldflags="-s -w"

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

help: ## Показать справку
	@echo "Доступные команды:"
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2}'

build: ## Собрать для текущей платформы
	@echo "$(GREEN)Сборка VPN Client...$(NC)"
	$(GO) mod download
	$(GO) build $(GOFLAGS) -o $(BINARY_NAME) main.go
	@echo "$(GREEN)✓ Сборка завершена: $(BINARY_NAME)$(NC)"

build-all: ## Собрать для всех платформ
	@echo "$(GREEN)Сборка для всех платформ...$(NC)"
	@$(MAKE) build-linux
	@$(MAKE) build-windows
	@$(MAKE) build-darwin
	@echo "$(GREEN)✓ Сборка для всех платформ завершена$(NC)"

build-linux: ## Собрать для Linux
	@echo "$(GREEN)Сборка для Linux...$(NC)"
	GOOS=linux GOARCH=amd64 $(GO) build $(GOFLAGS) -o $(BINARY_UNIX)-linux-amd64 main.go
	@echo "$(GREEN)✓ Linux: $(BINARY_UNIX)-linux-amd64$(NC)"

build-windows: ## Собрать для Windows
	@echo "$(GREEN)Сборка для Windows...$(NC)"
	GOOS=windows GOARCH=amd64 $(GO) build $(GOFLAGS) -o $(BINARY_WINDOWS) main.go
	@echo "$(GREEN)✓ Windows: $(BINARY_WINDOWS)$(NC)"

build-darwin: ## Собрать для macOS
	@echo "$(GREEN)Сборка для macOS...$(NC)"
	GOOS=darwin GOARCH=amd64 $(GO) build $(GOFLAGS) -o $(BINARY_UNIX)-darwin-amd64 main.go
	GOOS=darwin GOARCH=arm64 $(GO) build $(GOFLAGS) -o $(BINARY_UNIX)-darwin-arm64 main.go
	@echo "$(GREEN)✓ macOS Intel: $(BINARY_UNIX)-darwin-amd64$(NC)"
	@echo "$(GREEN)✓ macOS ARM: $(BINARY_UNIX)-darwin-arm64$(NC)"

run: build ## Собрать и запустить
	@echo "$(GREEN)Запуск VPN Client...$(NC)"
	./$(BINARY_NAME)

test: ## Запустить тесты
	@echo "$(GREEN)Запуск тестов...$(NC)"
	$(GO) test -v ./...

clean: ## Очистить собранные файлы
	@echo "$(GREEN)Очистка...$(NC)"
	$(GO) clean
	rm -f $(BINARY_NAME)
	rm -f $(BINARY_WINDOWS)
	rm -f $(BINARY_UNIX)-*
	@echo "$(GREEN)✓ Очистка завершена$(NC)"

install: build ## Установить в систему
	@echo "$(GREEN)Установка VPN Client...$(NC)"
	@if [ "$(shell uname)" = "Linux" ] || [ "$(shell uname)" = "Darwin" ]; then \
		sudo cp $(BINARY_NAME) /usr/local/bin/; \
		sudo chmod +x /usr/local/bin/$(BINARY_NAME); \
		echo "$(GREEN)✓ Установлено в /usr/local/bin/$(BINARY_NAME)$(NC)"; \
	else \
		echo "Установка поддерживается только на Linux и macOS"; \
	fi

uninstall: ## Удалить из системы
	@echo "$(GREEN)Удаление VPN Client...$(NC)"
	@if [ "$(shell uname)" = "Linux" ] || [ "$(shell uname)" = "Darwin" ]; then \
		sudo rm -f /usr/local/bin/$(BINARY_NAME); \
		echo "$(GREEN)✓ Удалено из /usr/local/bin/$(BINARY_NAME)$(NC)"; \
	else \
		echo "Удаление поддерживается только на Linux и macOS"; \
	fi

deps: ## Установить зависимости
	@echo "$(GREEN)Установка зависимостей...$(NC)"
	$(GO) mod download
	$(GO) mod tidy
	@echo "$(GREEN)✓ Зависимости установлены$(NC)"

fmt: ## Форматировать код
	@echo "$(GREEN)Форматирование кода...$(NC)"
	$(GO) fmt ./...
	@echo "$(GREEN)✓ Код отформатирован$(NC)"

lint: ## Проверить код линтером
	@echo "$(GREEN)Проверка кода...$(NC)"
	@if command -v golangci-lint > /dev/null; then \
		golangci-lint run; \
	else \
		echo "golangci-lint не установлен. Установите: https://golangci-lint.run/usage/install/"; \
	fi

dev: ## Режим разработки (сборка и запуск при изменениях)
	@echo "$(GREEN)Режим разработки...$(NC)"
	@if command -v air > /dev/null; then \
		air; \
	else \
		echo "air не установлен. Установите: go install github.com/cosmtrek/air@latest"; \
		echo "Запуск обычной сборки..."; \
		$(MAKE) run; \
	fi

size: build ## Показать размер бинарника
	@echo "$(GREEN)Размер бинарника:$(NC)"
	@ls -lh $(BINARY_NAME) | awk '{print $$5 " " $$9}'

version: ## Показать версию Go
	@$(GO) version

.DEFAULT_GOAL := help
