# Apollinare - Makefile per sviluppo
# Uso: make <target>

.PHONY: help install build run dev clean test lint backend frontend backend-run frontend-run backend-build frontend-build all stop

# Variabili
BACKEND_DIR := src/Apollinare.API
FRONTEND_DIR := frontend
BACKEND_PORT := 5000
FRONTEND_PORT := 5173

# Colori per output
CYAN := \033[0;36m
GREEN := \033[0;32m
YELLOW := \033[0;33m
NC := \033[0m # No Color

help: ## Mostra questo help
	@echo "$(CYAN)Apollinare - Comandi disponibili:$(NC)"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  $(GREEN)%-20s$(NC) %s\n", $$1, $$2}'
	@echo ""
	@echo "$(YELLOW)Esempi:$(NC)"
	@echo "  make install    # Installa tutte le dipendenze"
	@echo "  make dev        # Avvia backend e frontend in dev mode"
	@echo "  make build      # Compila tutto per produzione"

# ============================================
# INSTALLAZIONE
# ============================================

install: backend-restore frontend-install ## Installa tutte le dipendenze (backend + frontend)
	@echo "$(GREEN)Tutte le dipendenze installate!$(NC)"

backend-restore: ## Ripristina i pacchetti NuGet del backend
	@echo "$(CYAN)Ripristino pacchetti NuGet...$(NC)"
	cd src && dotnet restore

frontend-install: ## Installa le dipendenze npm del frontend
	@echo "$(CYAN)Installazione dipendenze npm...$(NC)"
	cd $(FRONTEND_DIR) && npm install

# ============================================
# BUILD
# ============================================

build: backend-build frontend-build ## Compila backend e frontend
	@echo "$(GREEN)Build completata!$(NC)"

backend-build: ## Compila il backend .NET
	@echo "$(CYAN)Compilazione backend...$(NC)"
	cd src && dotnet build --configuration Release

frontend-build: ## Compila il frontend React
	@echo "$(CYAN)Compilazione frontend...$(NC)"
	cd $(FRONTEND_DIR) && npm run build

# ============================================
# ESECUZIONE SVILUPPO
# ============================================

dev: ## Avvia backend e frontend in parallelo (dev mode)
	@echo "$(CYAN)Avvio in modalita' sviluppo...$(NC)"
	@echo "$(YELLOW)Backend: http://localhost:$(BACKEND_PORT)$(NC)"
	@echo "$(YELLOW)Frontend: http://localhost:$(FRONTEND_PORT)$(NC)"
	@echo ""
	@$(MAKE) -j2 backend-run frontend-run

backend-run: ## Avvia solo il backend in dev mode
	@echo "$(CYAN)Avvio backend su porta $(BACKEND_PORT)...$(NC)"
	cd $(BACKEND_DIR) && dotnet run

frontend-run: ## Avvia solo il frontend in dev mode
	@echo "$(CYAN)Avvio frontend su porta $(FRONTEND_PORT)...$(NC)"
	cd $(FRONTEND_DIR) && npm run dev

backend-watch: ## Avvia il backend con hot reload (dotnet watch)
	@echo "$(CYAN)Avvio backend con hot reload...$(NC)"
	cd $(BACKEND_DIR) && dotnet watch run

# ============================================
# TEST E LINTING
# ============================================

test: backend-test ## Esegue tutti i test
	@echo "$(GREEN)Test completati!$(NC)"

backend-test: ## Esegue i test del backend
	@echo "$(CYAN)Esecuzione test backend...$(NC)"
	cd src && dotnet test

lint: frontend-lint ## Esegue il linting
	@echo "$(GREEN)Linting completato!$(NC)"

frontend-lint: ## Esegue ESLint sul frontend
	@echo "$(CYAN)Linting frontend...$(NC)"
	cd $(FRONTEND_DIR) && npm run lint

# ============================================
# PULIZIA
# ============================================

clean: backend-clean frontend-clean ## Pulisce tutti gli artefatti di build
	@echo "$(GREEN)Pulizia completata!$(NC)"

backend-clean: ## Pulisce gli artefatti di build del backend
	@echo "$(CYAN)Pulizia backend...$(NC)"
	cd src && dotnet clean
	find src -type d -name "bin" -exec rm -rf {} + 2>/dev/null || true
	find src -type d -name "obj" -exec rm -rf {} + 2>/dev/null || true

frontend-clean: ## Pulisce gli artefatti di build del frontend
	@echo "$(CYAN)Pulizia frontend...$(NC)"
	rm -rf $(FRONTEND_DIR)/dist
	rm -rf $(FRONTEND_DIR)/node_modules/.vite

clean-all: clean ## Pulizia completa (include node_modules)
	@echo "$(CYAN)Rimozione node_modules...$(NC)"
	rm -rf $(FRONTEND_DIR)/node_modules

# ============================================
# DATABASE
# ============================================

db-update: ## Applica le migration del database
	@echo "$(CYAN)Applicazione migration...$(NC)"
	cd $(BACKEND_DIR) && dotnet ef database update

db-migration: ## Crea una nuova migration (usa: make db-migration NAME=NomeMigration)
	@echo "$(CYAN)Creazione migration: $(NAME)$(NC)"
	cd $(BACKEND_DIR) && dotnet ef migrations add $(NAME)

# ============================================
# UTILITY
# ============================================

logs: ## Mostra i log del backend (se in esecuzione)
	@tail -f $(BACKEND_DIR)/logs/*.log 2>/dev/null || echo "Nessun file di log trovato"

check: ## Verifica che tutti i prerequisiti siano installati
	@echo "$(CYAN)Verifica prerequisiti...$(NC)"
	@command -v dotnet >/dev/null 2>&1 && echo "$(GREEN)dotnet:$(NC) $$(dotnet --version)" || echo "$(YELLOW)dotnet: non trovato$(NC)"
	@command -v node >/dev/null 2>&1 && echo "$(GREEN)node:$(NC) $$(node --version)" || echo "$(YELLOW)node: non trovato$(NC)"
	@command -v npm >/dev/null 2>&1 && echo "$(GREEN)npm:$(NC) $$(npm --version)" || echo "$(YELLOW)npm: non trovato$(NC)"

# Target di default
.DEFAULT_GOAL := help
