# Makefile для GPIO Monitor Server

.PHONY: all build clean run test fmt lint help install dev

# Переменные
APP_NAME := gpio-monitor-server
CMD_PATH := ./cmd/server
BUILD_DIR := ./build
BINARY := $(BUILD_DIR)/$(APP_NAME)
WEB_DIR := ./cmd/server/web

# Целевая платформа (по умолчанию)
GOOS ?= linux
GOARCH ?= arm64

# Флаги сборки
LDFLAGS := -ldflags="-s -w"

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

# ============================================
# ОСНОВНЫЕ ЦЕЛИ
# ============================================

all: help

## build - Полная сборка проекта (фронтенд + бекенд)
build: build-frontend build-backend
	@echo "$(GREEN)Сборка завершена!$(NC)"
	@ls -lh $(BINARY)

## build-frontend - Сборка TypeScript фронтенда
build-frontend:
	@echo "$(YELLOW)Сборка TypeScript фронтенда...$(NC)"
	@cd $(WEB_DIR) && \
		if [ ! -d "node_modules" ]; then \
			echo "   Установка npm зависимостей..."; \
			npm install; \
		fi && \
		echo "   Компиляция TypeScript..." && \
		npm run build && \
		echo "$(GREEN)   TypeScript скомпилирован успешно!$(NC)"

## build-backend - Сборка Go сервера
build-backend:
	@echo "$(YELLOW)🔧 Сборка Go сервера...$(NC)"
	@mkdir -p $(BUILD_DIR)
	@echo "   Целевая платформа: $(GOOS)/$(GOARCH)"
	@GOOS=$(GOOS) GOARCH=$(GOARCH) go build $(LDFLAGS) -o $(BINARY) $(CMD_PATH)
	@echo "$(GREEN)   Go сервер скомпилирован успешно!$(NC)"

## run - Запуск сервера (сборка + запуск)
run: build
	@echo "$(YELLOW)Запуск сервера...$(NC)"
	@$(BINARY)

## dev - Режим разработки (без оптимизации, с hot-reload)
dev:
	@echo "$(YELLOW) Режим разработки...$(NC)"
	@go run $(CMD_PATH) -port :8080

## clean - Очистка артефактов сборки
clean:
	@echo "$(YELLOW)Очистка...$(NC)"
	@rm -rf $(BUILD_DIR)
	@rm -rf $(WEB_DIR)/dist
	@rm -rf $(WEB_DIR)/node_modules
	@echo "$(GREEN) Очищено$(NC)"

## test - Запуск тестов
test:
	@echo "$(YELLOW)Запуск тестов...$(NC)"
	@go test -v ./...

## fmt - Форматирование кода
fmt:
	@echo "$(YELLOW) Форматирование кода...$(NC)"
	@go fmt ./...
	@cd $(WEB_DIR) && npm run format 2>/dev/null || true

## lint - Проверка кода
lint:
	@echo "$(YELLOW) Проверка кода...$(NC)"
	@golangci-lint run ./... 2>/dev/null || echo "   Установите golangci-lint: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"

## deps - Установка зависимостей
deps:
	@echo "$(YELLOW) Установка зависимостей...$(NC)"
	@go mod download
	@go mod tidy
	@cd $(WEB_DIR) && npm install

## install - Установка бинарника в систему
install: build
	@echo "$(YELLOW)Установка $(APP_NAME)...$(NC)"
	@sudo cp $(BINARY) /usr/local/bin/$(APP_NAME)
	@echo "$(GREEN) Установлено в /usr/local/bin/$(APP_NAME)$(NC)"

## uninstall - Удаление из системы
uninstall:
	@echo "$(YELLOW)Удаление $(APP_NAME)...$(NC)"
	@sudo rm -f /usr/local/bin/$(APP_NAME)
	@echo "$(GREEN)Удалено$(NC)"

## help - Показать справку
help:
	@echo "$(GREEN)GPIO Monitor Server - команды Makefile$(NC)"
	@echo ""
	@echo "Доступные команды:"
	@awk '/^##/ { \
		cmd = $$0; \
		gsub(/^## /, "", cmd); \
		printf "  $(GREEN)%-20s$(NC) %s\n", $$2, cmd \
	}' $(MAKEFILE_LIST) | sort
	@echo ""
	@echo "Примеры:"
	@echo "  make build        - Полная сборка"
	@echo "  make run          - Сборка и запуск"
	@echo "  make dev          - Запуск в режиме разработки"
	@echo "  make clean        - Очистка"
	@echo "  make install      - Установка в систему"

# ============================================
# ДОПОЛНИТЕЛЬНЫЕ ЦЕЛИ
# ============================================

## build-arm64 - Сборка для ARM64 (Raspberry Pi)
build-arm64:
	@$(MAKE) build GOOS=linux GOARCH=arm64

## build-amd64 - Сборка для AMD64
build-amd64:
	@$(MAKE) build GOOS=linux GOARCH=amd64

## build-mac - Сборка для macOS
build-mac:
	@$(MAKE) build GOOS=darwin GOARCH=amd64

## build-windows - Сборка для Windows
build-windows:
	@$(MAKE) build GOOS=windows GOARCH=amd64

## build-all - Сборка для всех платформ
build-all: build-arm64 build-amd64 build-mac build-windows
	@echo "$(GREEN)Все платформы собраны$(NC)"

## docker-build - Сборка Docker образа
docker-build:
	@echo "$(YELLOW)Сборка Docker образа...$(NC)"
	@docker build -t gpio-monitor:latest .

## docker-run - Запуск в Docker
docker-run:
	@echo "$(YELLOW)Запуск в Docker...$(NC)"
	@docker run -p 8080:8080 gpio-monitor:latest
