# DevOps CLI Makefile

.PHONY: all build test lint clean install run help

# Variables
BINARY_NAME=devops
BUILD_DIR=bin
CMD_DIR=cmd/devops

# Go parameters
GOCMD=go
GOBUILD=$(GOCMD) build
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
GOMOD=$(GOCMD) mod
GOFMT=$(GOCMD) fmt

# Build flags
LDFLAGS=-ldflags "-s -w"

all: clean build

# Build the binary
build:
	@echo "🔨 Building $(BINARY_NAME)..."
	@mkdir -p $(BUILD_DIR)
	$(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME) $(CMD_DIR)
	@echo "✅ Built $(BUILD_DIR)/$(BINARY_NAME)"

# Build for all platforms
build-all:
	@echo "🔨 Building for all platforms..."
	@mkdir -p $(BUILD_DIR)
	GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 $(CMD_DIR)
	GOOS=linux GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 $(CMD_DIR)
	GOOS=darwin GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64 $(CMD_DIR)
	GOOS=darwin GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 $(CMD_DIR)
	GOOS=windows GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe $(CMD_DIR)
	@echo "✅ Built for all platforms"

# Run tests
test:
	@echo "🧪 Running tests..."
	$(GOTEST) -v -race ./...

# Run tests with coverage
test-coverage:
	@echo "🧪 Running tests with coverage..."
	$(GOTEST) -v -race -coverprofile=coverage.out ./...
	$(GOCMD) tool cover -html=coverage.out -o coverage.html
	@echo "📊 Coverage report: coverage.html"

# Run linter
lint:
	@echo "🔍 Running linter..."
	@if command -v golangci-lint &> /dev/null; then \
		golangci-lint run ./...; \
	else \
		echo "⚠️  golangci-lint not found. Install with: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"; \
	fi

# Format code
fmt:
	@echo "📝 Formatting code..."
	$(GOFMT) ./...

# Download dependencies
deps:
	@echo "📦 Downloading dependencies..."
	$(GOMOD) download
	$(GOMOD) tidy

# Clean build artifacts
clean:
	@echo "🧹 Cleaning..."
	@rm -rf $(BUILD_DIR)
	@rm -f coverage.out coverage.html
	@echo "✅ Clean complete"

# Install binary
install:
	@echo "📥 Installing..."
	$(GOBUILD) $(LDFLAGS) -o /usr/local/bin/$(BINARY_NAME) $(CMD_DIR)
	@echo "✅ Installed to /usr/local/bin/$(BINARY_NAME)"

# Run CLI locally
run:
	@echo "🏃 Running CLI..."
	$(GOBUILD) $(LDFLAGS) -o /tmp/$(BINARY_NAME) $(CMD_DIR) && /tmp/$(BINARY_NAME) $(ARGS)

# Development mode
dev:
	@echo "🚀 Development mode..."
	@mkdir -p $(BUILD_DIR)
	watchexec -w cmd -w internal --restart -- $(MAKE) run ARGS="$(ARGS)"

# Docker build
docker-build:
	@echo "🐳 Building Docker image..."
	docker build -t devops-cli:latest .

# Docker run
docker-run:
	@echo "🐳 Running in Docker..."
	docker run --rm -it \
		-v $$(pwd):/project \
		-v /var/run/docker.sock:/var/run/docker.sock \
		--privileged \
		devops-cli:latest $(ARGS)

# Help
help:
	@echo "DevOps CLI - Makefile Commands"
	@echo ""
	@echo "  make build         Build the binary"
	@echo "  make build-all    Build for all platforms"
	@echo "  make test         Run tests"
	@echo "  make test-coverage Run tests with coverage"
	@echo "  make lint         Run linter"
	@echo "  make fmt          Format code"
	@echo "  make deps         Download dependencies"
	@echo "  make clean        Clean build artifacts"
	@echo "  make install      Install binary"
	@echo "  make run          Run CLI locally"
	@echo "  make dev          Development mode with watch"
	@echo "  make docker-build Build Docker image"
	@echo "  make docker-run   Run in Docker"
	@echo "  make help         Show this help"
