# Makefile pour Veza Backend API
# Ce Makefile facilite le développement et la maintenance du backend Go

.PHONY: help build test clean lint format vet tidy deps install run dev docker-build docker-run

# Variables
BINARY_NAME=veza-backend-api
DOCKER_IMAGE=veza-backend-api
DOCKER_TAG=latest
GO_VERSION=1.21
LINT_VERSION=1.54.2

# Couleurs pour les messages
GREEN=\033[0;32m
YELLOW=\033[1;33m
RED=\033[0;31m
NC=\033[0m # No Color

# Aide par défaut
help: ## Affiche cette aide
	@echo "$(GREEN)Veza Backend API - Makefile$(NC)"
	@echo ""
	@echo "$(YELLOW)Commandes disponibles:$(NC)"
	@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "  $(GREEN)%-15s$(NC) %s\n", $$1, $$2}' $(MAKEFILE_LIST)

# Développement
build: ## Compile l'application
	@echo "$(GREEN)🔨 Compilation de l'application...$(NC)"
	@go build -o bin/$(BINARY_NAME) ./cmd/modern-server/main.go
	@echo "$(GREEN)✅ Compilation terminée: bin/$(BINARY_NAME)$(NC)"

build-linux: ## Compile l'application pour Linux
	@echo "$(GREEN)🔨 Compilation pour Linux...$(NC)"
	@GOOS=linux GOARCH=amd64 go build -o bin/$(BINARY_NAME)-linux ./cmd/modern-server/main.go
	@echo "$(GREEN)✅ Compilation Linux terminée: bin/$(BINARY_NAME)-linux$(NC)"

# Tests
test: ## Exécute tous les tests
	@echo "$(GREEN)🧪 Exécution des tests...$(NC)"
	@go test -v ./...

test-coverage: ## Exécute les tests avec couverture
	@echo "$(GREEN)🧪 Tests avec couverture...$(NC)"
	@go test -coverprofile=coverage.out ./...
	@go tool cover -html=coverage.out -o coverage.html
	@echo "$(GREEN)✅ Rapport de couverture généré: coverage.html$(NC)"

test-race: ## Exécute les tests avec détection de race conditions
	@echo "$(GREEN)🧪 Tests avec détection de race conditions...$(NC)"
	@go test -race ./...

# Qualité du code
lint: ## Exécute golangci-lint
	@echo "$(GREEN)🔍 Vérification avec golangci-lint...$(NC)"
	@if command -v golangci-lint >/dev/null 2>&1; then \
		golangci-lint run; \
	else \
		echo "$(YELLOW)⚠️  golangci-lint non installé. Installation...$(NC)"; \
		go install github.com/golangci/golangci-lint/cmd/golangci-lint@v$(LINT_VERSION); \
		golangci-lint run; \
	fi

format: ## Formate le code Go
	@echo "$(GREEN)🎨 Formatage du code...$(NC)"
	@go fmt ./...
	@if command -v goimports >/dev/null 2>&1; then \
		find . -name "*.go" -not -path "./vendor/*" | xargs goimports -w; \
	else \
		echo "$(YELLOW)⚠️  goimports non installé. Installation...$(NC)"; \
		go install golang.org/x/tools/cmd/goimports@latest; \
		find . -name "*.go" -not -path "./vendor/*" | xargs goimports -w; \
	fi
	@echo "$(GREEN)✅ Code formaté$(NC)"

vet: ## Exécute go vet
	@echo "$(GREEN)🔍 Vérification avec go vet...$(NC)"
	@go vet ./...

# Dépendances
deps: ## Installe les dépendances
	@echo "$(GREEN)📦 Installation des dépendances...$(NC)"
	@go mod download
	@go mod tidy
	@echo "$(GREEN)✅ Dépendances installées$(NC)"

install: ## Installe l'application
	@echo "$(GREEN)📦 Installation de l'application...$(NC)"
	@go install ./cmd/modern-server/main.go
	@echo "$(GREEN)✅ Application installée$(NC)"

# Nettoyage
clean: ## Nettoie les fichiers générés
	@echo "$(GREEN)🧹 Nettoyage...$(NC)"
	@rm -rf bin/
	@rm -f coverage.out coverage.html
	@go clean
	@echo "$(GREEN)✅ Nettoyage terminé$(NC)"

# Exécution
run: build ## Compile et exécute l'application
	@echo "$(GREEN)🚀 Démarrage de l'application...$(NC)"
	@./bin/$(BINARY_NAME)

dev: ## Exécute l'application en mode développement
	@echo "$(GREEN)🚀 Mode développement...$(NC)"
	@go run ./cmd/modern-server/main.go

# Docker
docker-build: ## Construit l'image Docker
	@echo "$(GREEN)🐳 Construction de l'image Docker...$(NC)"
	@docker build -t $(DOCKER_IMAGE):$(DOCKER_TAG) .
	@echo "$(GREEN)✅ Image Docker construite: $(DOCKER_IMAGE):$(DOCKER_TAG)$(NC)"

docker-run: docker-build ## Construit et exécute l'image Docker
	@echo "$(GREEN)🐳 Exécution de l'image Docker...$(NC)"
	@docker run -p 8080:8080 $(DOCKER_IMAGE):$(DOCKER_TAG)

# Outils de développement
install-tools: ## Installe les outils de développement
	@echo "$(GREEN)🛠️  Installation des outils de développement...$(NC)"
	@go install golang.org/x/tools/cmd/goimports@latest
	@go install github.com/golangci/golangci-lint/cmd/golangci-lint@v$(LINT_VERSION)
	@go install github.com/securecodewarrior/gosec/v2/cmd/gosec@latest
	@go install honnef.co/go/tools/cmd/staticcheck@latest
	@echo "$(GREEN)✅ Outils installés$(NC)"

# Sécurité
security: ## Exécute les vérifications de sécurité
	@echo "$(GREEN)🔒 Vérifications de sécurité...$(NC)"
	@if command -v gosec >/dev/null 2>&1; then \
		gosec ./...; \
	else \
		echo "$(YELLOW)⚠️  gosec non installé. Installation...$(NC)"; \
		go install github.com/securecodewarrior/gosec/v2/cmd/gosec@latest; \
		gosec ./...; \
	fi

# Performance
benchmark: ## Exécute les benchmarks
	@echo "$(GREEN)⚡ Exécution des benchmarks...$(NC)"
	@go test -bench=. ./...

# Documentation
docs: ## Génère la documentation
	@echo "$(GREEN)📚 Génération de la documentation...$(NC)"
	@go doc -all ./... > docs.txt
	@echo "$(GREEN)✅ Documentation générée: docs.txt$(NC)"

# Scripts personnalisés
cleanup: ## Exécute le script de nettoyage
	@echo "$(GREEN)🧹 Exécution du script de nettoyage...$(NC)"
	@./scripts/cleanup-go.sh

# CI/CD
ci: deps lint test build ## Pipeline CI complet
	@echo "$(GREEN)✅ Pipeline CI terminé$(NC)"

# Déploiement
deploy-staging: build-linux ## Déploie en staging
	@echo "$(GREEN)🚀 Déploiement en staging...$(NC)"
	@echo "$(YELLOW)⚠️  Déploiement en staging non implémenté$(NC)"

deploy-production: build-linux ## Déploie en production
	@echo "$(GREEN)🚀 Déploiement en production...$(NC)"
	@echo "$(YELLOW)⚠️  Déploiement en production non implémenté$(NC)"

# Monitoring
health: ## Vérifie la santé de l'application
	@echo "$(GREEN)🏥 Vérification de la santé...$(NC)"
	@curl -f http://localhost:8080/health || echo "$(RED)❌ Application non accessible$(NC)"

# Base de données
migrate: ## Exécute les migrations de base de données
	@echo "$(GREEN)🗄️  Exécution des migrations...$(NC)"
	@go run cmd/migrate_tool/main.go
	@echo "$(GREEN)✅ Migrations terminées$(NC)"

db-migrate: migrate ## Alias pour migrate

db-seed: ## Peuple la base de données avec des données de test
	@echo "$(GREEN)🌱 Peuplement de la base de données...$(NC)"
	@echo "$(YELLOW)⚠️  Seeding non implémenté$(NC)"

# Par défaut
.DEFAULT_GOAL := help
