# Makefile for Installer Builder

# 基本变量
NAME := installer-builder
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
COMMIT_HASH := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
BUILD_TIME := $(shell date -u '+%Y-%m-%d %H:%M:%S')
LDFLAGS := -ldflags "-X git.kingecg.top/kingecg/installerbuilder/internal/version.Version=$(VERSION) \
                     -X git.kingecg.top/kingecg/installerbuilder/internal/version.CommitHash=$(COMMIT_HASH) \
                     -X git.kingecg.top/kingecg/installerbuilder/internal/version.BuildTime=$(BUILD_TIME)"

# 目标平台
PLATFORMS := linux windows darwin
ARCHITECTURES := amd64 arm64

# 输出目录
DIST_DIR := dist

# Go命令
GO := go
GOBUILD := $(GO) build
GOTEST := $(GO) test
GOCLEAN := $(GO) clean
GOMOD := $(GO) mod
GOGET := $(GO) get
GOFMT := $(GO) fmt
GOLINT := golangci-lint

# 默认目标
.PHONY: all
all: clean build

# 构建目标
.PHONY: build
build:
	@echo "构建 $(NAME)..."
	@mkdir -p $(DIST_DIR)
	$(GOBUILD) $(LDFLAGS) -o $(DIST_DIR)/$(NAME) ./cmd/cli

# 构建所有平台
.PHONY: build-all
build-all:
	@echo "构建所有平台的二进制文件..."
	@mkdir -p $(DIST_DIR)
	@for platform in $(PLATFORMS); do \
		for arch in $(ARCHITECTURES); do \
			output_dir=$(DIST_DIR)/$$platform; \
			mkdir -p $$output_dir; \
			output_name=$$output_dir/$(NAME); \
			if [ "$$platform" = "windows" ]; then output_name=$$output_name.exe; fi; \
			echo "构建 $$platform/$$arch..."; \
			GOOS=$$platform GOARCH=$$arch $(GOBUILD) $(LDFLAGS) -o $$output_name ./cmd/cli || exit 1; \
		done; \
	done

# 运行测试
.PHONY: test
test:
	@echo "运行测试..."
	$(GOTEST) -v ./...

# 运行测试覆盖率
.PHONY: test-coverage
test-coverage:
	@echo "运行测试覆盖率..."
	$(GOTEST) -v -coverprofile=coverage.out ./...
	$(GO) tool cover -html=coverage.out -o coverage.html

# 运行代码检查
.PHONY: lint
lint:
	@echo "运行代码检查..."
	$(GOLINT) run

# 格式化代码
.PHONY: fmt
fmt:
	@echo "格式化代码..."
	$(GOFMT) ./...

# 清理构建产物
.PHONY: clean
clean:
	@echo "清理构建产物..."
	$(GOCLEAN)
	rm -rf $(DIST_DIR)
	rm -f coverage.out coverage.html

# 初始化项目
.PHONY: init
init:
	@echo "初始化项目..."
	$(GOMOD) tidy
	$(GOGET) -u ./...

# 安装二进制文件
.PHONY: install
install: build
	@echo "安装 $(NAME)..."
	cp $(DIST_DIR)/$(NAME) /usr/local/bin/

# 卸载二进制文件
.PHONY: uninstall
uninstall:
	@echo "卸载 $(NAME)..."
	rm -f /usr/local/bin/$(NAME)

# 帮助信息
.PHONY: help
help:
	@echo "Installer Builder Makefile"
	@echo ""
	@echo "使用方法:"
	@echo "  make [target]"
	@echo ""
	@echo "目标:"
	@echo "  all             默认目标，执行clean和build"
	@echo "  build           构建项目"
	@echo "  build-all       构建所有平台的二进制文件"
	@echo "  test            运行测试"
	@echo "  test-coverage   运行测试覆盖率"
	@echo "  lint            运行代码检查"
	@echo "  fmt             格式化代码"
	@echo "  clean           清理构建产物"
	@echo "  init            初始化项目"
	@echo "  install         安装二进制文件"
	@echo "  uninstall       卸载二进制文件"
	@echo "  help            显示帮助信息"