# Makefile для GPIO Monitor Server

.PHONY: all build clean run test fmt lint help install dev deb prepare-debian

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

# Целевая платформа (по умолчанию)
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
	@rm -rf $(DEB_PACKAGE)
	@rm -f *.deb
	@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      - Установка в систему"
	@echo "  make deb          - Сборка DEB пакета"

# ============================================
# СБОРКА DEB ПАКЕТА
# ============================================

## prepare-debian - Подготовка структуры для deb-пакета
prepare-debian:
	@echo "$(YELLOW)Подготовка структуры DEB пакета...$(NC)"
	@# Создаем основную структуру
	@mkdir -p $(DEB_PACKAGE)/DEBIAN
	@mkdir -p $(DEB_PACKAGE)/usr/bin
	@mkdir -p $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)
	@mkdir -p $(DEB_PACKAGE)/opt/gpio-monitoring/web
	@mkdir -p $(DEB_PACKAGE)/etc/gpio-monitoring
	@mkdir -p $(DEB_PACKAGE)/etc/systemd/system
	@# Копируем DEBIAN файлы
	@if [ -f $(DEB_DIR)/control ]; then cp $(DEB_DIR)/control $(DEB_PACKAGE)/DEBIAN/; fi
	@if [ -f $(DEB_DIR)/preinst ]; then cp $(DEB_DIR)/preinst $(DEB_PACKAGE)/DEBIAN/; fi
	@if [ -f $(DEB_DIR)/postinst ]; then cp $(DEB_DIR)/postinst $(DEB_PACKAGE)/DEBIAN/; fi
	@if [ -f $(DEB_DIR)/prerm ]; then cp $(DEB_DIR)/prerm $(DEB_PACKAGE)/DEBIAN/; fi
	@if [ -f $(DEB_DIR)/postrm ]; then cp $(DEB_DIR)/postrm $(DEB_PACKAGE)/DEBIAN/; fi
	@# Копируем документацию
	@if [ -f $(DEB_DIR)/copyright ]; then cp $(DEB_DIR)/copyright $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; fi
	@if [ -f $(DEB_DIR)/changelog ]; then \
		cp $(DEB_DIR)/changelog $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; \
		gzip -9 -n $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/changelog 2>/dev/null || true; \
	fi
	@# Устанавливаем права
	@chmod 755 $(DEB_PACKAGE)/DEBIAN/* 2>/dev/null || true
	@echo "$(GREEN)Структура подготовлена$(NC)"

## deb - Сборка DEB пакета
deb: clean build-frontend build-backend prepare-debian
	@echo "$(YELLOW)Сборка DEB пакета...$(NC)"
	@# Копируем бинарник
	@cp $(BINARY) $(DEB_PACKAGE)/usr/bin/
	@# Копируем веб-файлы
	@if [ -d "$(WEB_DIR)/dist" ]; then cp -r $(WEB_DIR)/dist $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
	@if [ -d "$(WEB_DIR)/css" ]; then cp -r $(WEB_DIR)/css $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
	@if [ -d "$(WEB_DIR)/fonts" ]; then cp -r $(WEB_DIR)/fonts $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
	@if ls $(WEB_DIR)/*.html 1>/dev/null 2>&1; then cp $(WEB_DIR)/*.html $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi
	@if [ -f "$(WEB_DIR)/favicon.png" ]; then cp $(WEB_DIR)/favicon.png $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi
	@# Копируем systemd сервис
	@if [ -f "$(DEB_DIR)/$(APP_NAME).service" ]; then cp $(DEB_DIR)/$(APP_NAME).service $(DEB_PACKAGE)/etc/systemd/system/; fi
	@# Копируем конфиг
	@if [ -f "$(DEB_DIR)/$(APP_NAME).conf" ]; then cp $(DEB_DIR)/$(APP_NAME).conf $(DEB_PACKAGE)/etc/gpio-monitoring/config; fi
	@# Копируем скрипт для логов
	@if [ -f "$(DEB_DIR)/usr/bin/gpio-logs" ]; then \
		cp $(DEB_DIR)/usr/bin/gpio-logs $(DEB_PACKAGE)/usr/bin/; \
		chmod +x $(DEB_PACKAGE)/usr/bin/gpio-logs; \
	fi
	@# Устанавливаем правильные права
	@chown -R root:root $(DEB_PACKAGE) 2>/dev/null || true
	@# Создаем архив с контрольными суммами
	@cd $(DEB_PACKAGE) && find . -type f ! -path "./DEBIAN/*" -exec md5sum {} \; > DEBIAN/md5sums 2>/dev/null || true
	@# Собираем пакет
	@dpkg-deb --root-owner-group --build $(DEB_PACKAGE) .
	@mkdir -p $(BUILD_DIR)
	@mv *.deb $(BUILD_DIR)/
	@echo "$(GREEN)DEB пакет создан: $(BUILD_DIR)/$(APP_NAME).deb$(NC)"
	@ls -lh $(BUILD_DIR)/*.deb
	@echo ""
	@echo "$(GREEN)Информация о пакете:$(NC)"
	@dpkg-deb -I $(BUILD_DIR)/*.deb | head -15

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

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

## deb-clean - Очистка временных файлов deb-пакета
deb-clean:
	@echo "$(YELLOW)Очистка deb-временных файлов...$(NC)"
	@rm -rf $(DEB_PACKAGE)
	@rm -f $(BUILD_DIR)/$(APP_NAME).deb
	@echo "$(GREEN)Очищено$(NC)"

## deb-info - Показать информацию о deb-пакете
deb-info:
	@if [ -f "$(BUILD_DIR)/$(APP_NAME).deb" ]; then \
		dpkg-deb -I $(BUILD_DIR)/$(APP_NAME).deb; \
	else \
		echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \
	fi

## deb-contents - Показать содержимое deb-пакета
deb-contents:
	@if [ -f "$(BUILD_DIR)/$(APP_NAME).deb" ]; then \
		dpkg-deb -c $(BUILD_DIR)/$(APP_NAME).deb; \
	else \
		echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \
	fi
