.PHONY: all build build-linux build-windows clean dev help package upx

APP_NAME = code-server-bridge
ENTRY = ./cmd/server
OUTPUT_DIR = bin
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
BUILD_TIME = $(shell date -u '+%Y-%m-%d_%H:%M:%S')
GIT_COMMIT = $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")

# Go build flags with version injection
LDFLAGS = -ldflags "-s -w \
	-X 'main.Version=$(VERSION)' \
	-X 'main.BuildTime=$(BUILD_TIME)' \
	-X 'main.GitCommit=$(GIT_COMMIT)'"

# UPX settings
UPX = upx
UPX_FLAGS = --best --lzma

# Platforms
LINUX_ARCHS = amd64 arm64
WINDOWS_ARCHS = amd64

all: clean build-all upx

# Build for current platform
build:
	@echo "Building $(APP_NAME) for current platform..."
	go build $(LDFLAGS) -o $(APP_NAME) $(ENTRY)
	@echo "Build complete: $(APP_NAME)"

# Build for Linux platforms
build-linux:
	@echo "Building for Linux platforms..."
	@mkdir -p $(OUTPUT_DIR)
	@for arch in $(LINUX_ARCHS); do \
		echo "Building linux/$$arch..."; \
		GOOS=linux GOARCH=$$arch go build $(LDFLAGS) -o $(OUTPUT_DIR)/$(APP_NAME)-linux-$$arch $(ENTRY); \
	done
	@echo "Linux builds complete"

# Build for Windows platforms
build-windows:
	@echo "Building for Windows platforms..."
	@mkdir -p $(OUTPUT_DIR)
	@for arch in $(WINDOWS_ARCHS); do \
		echo "Building windows/$$arch..."; \
		GOOS=windows GOARCH=$$arch go build $(LDFLAGS) -o $(OUTPUT_DIR)/$(APP_NAME)-windows-$$arch.exe $(ENTRY); \
	done
	@echo "Windows builds complete"

# Build for all platforms
build-all: build-linux build-windows
	@echo "All platform builds complete"

# Package release
package: build-all upx
	@echo "Packaging releases..."
	@mkdir -p releases
	@for arch in $(LINUX_ARCHS); do \
		tar -czf releases/$(APP_NAME)-$(VERSION)-linux-$$arch.tar.gz -C $(OUTPUT_DIR) $(APP_NAME)-linux-$$arch; \
	done
	@for arch in $(WINDOWS_ARCHS); do \
		cd $(OUTPUT_DIR) && zip -q ../releases/$(APP_NAME)-$(VERSION)-windows-$$arch.zip $(APP_NAME)-windows-$$arch.exe && cd ..; \
	done
	@echo "Packaging complete: releases/"

# Development mode
dev:
	@echo "Running in development mode..."
	go run $(ENTRY)

# Clean build artifacts
clean:
	@echo "Cleaning build artifacts..."
	@rm -rf $(OUTPUT_DIR) releases $(APP_NAME) $(APP_NAME).exe
	@echo "Clean complete"

# Run tests
test:
	@echo "Running tests..."
	go test -v ./...

# Install dependencies
deps:
	@echo "Installing dependencies..."
	go mod download
	go mod tidy

# UPX Compression
upx:
	@echo "Compressing binaries with UPX..."
	@if command -v $(UPX) > /dev/null 2>&1; then \
		for file in $(OUTPUT_DIR)/*; do \
			if [ -f "$$file" ]; then \
				echo "Compressing $$file..."; \
				$(UPX) $(UPX_FLAGS) "$$file" 2>/dev/null || echo "⚠️  UPX压缩失败: $$file"; \
			fi; \
		done; \
		echo "✅ UPX compression complete"; \
	else \
		echo "⚠️  UPX not found, skipping compression"; \
		echo "Install UPX: https://upx.github.io/"; \
	fi

# Display help
help:
	@echo "Available targets:"
	@echo "  make build         - Build for current platform"
	@echo "  make build-linux   - Build for Linux (amd64, arm64)"
	@echo "  make build-windows - Build for Windows (amd64)"
	@echo "  make build-all     - Build for all platforms"
	@echo "  make upx           - Compress binaries with UPX"
	@echo "  make package       - Build, compress and package releases"
	@echo "  make dev           - Run in development mode"
	@echo "  make test          - Run tests"
	@echo "  make deps          - Install dependencies"
	@echo "  make clean         - Clean build artifacts"
