# ============================================
# Makefile — gotest 标准化构建命令
# 用法：make <target>
# ============================================

APP_NAME := gotest
BUILD_DIR := build
GO_LDFLAGS := -s -w

.DEFAULT_GOAL := help

## help: 显示所有可用命令
help:
	@echo ""
	@echo "$(APP_NAME) — 可用命令"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-18s\033[0m %s\n", $$1, $$2}'
	@echo ""

## build: 编译二进制到 build/ 目录
build:
	@echo "[BUILD] 编译 $(APP_NAME)..."
	@mkdir -p $(BUILD_DIR)
	CGO_ENABLED=0 go build -ldflags="$(GO_LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME) .
	@echo "[BUILD] 完成: $(BUILD_DIR)/$(APP_NAME)"

## run: 直接运行（go run）
run:
	go run .

## build-prod: 生产级编译（prod 模式）
build-prod:
	@echo "[BUILD] 生产级编译..."
	@mkdir -p $(BUILD_DIR)
	CGO_ENABLED=0 APP_ENV=prod go build -ldflags="$(GO_LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME) .
	@echo "[BUILD] 完成: $(BUILD_DIR)/$(APP_NAME)"

## test: 运行测试
test:
	go test -v ./...

## fmt: 格式化代码
fmt:
	go fmt ./...

## vet: 静态检查
vet:
	go vet ./...

## lint: 完整代码检查 (fmt + vet)
lint: fmt vet
	@echo "[LINT] 代码检查完成"

## docker-build: 构建 Docker 镜像
docker-build:
	@echo "[DOCKER] 构建镜像..."
	docker build -t $(APP_NAME):latest .
	@echo "[DOCKER] 完成: $(APP_NAME):latest"

## docker-up: Docker Compose 启动全部服务
docker-up:
	docker-compose up -d
	@echo "[DOCKER] 服务已启动: http://localhost:8080"

## docker-down: Docker Compose 停止全部服务
docker-down:
	docker-compose down

## clean: 清理构建产物
clean:
	@echo "[CLEAN] 清理..."
	rm -rf $(BUILD_DIR) data/app.db
	@echo "[CLEAN] 完成"

## tidy: 整理 Go 模块依赖
tidy:
	go mod tidy

## all: 完整流程 (lint → build → test)
all: lint build test
	@echo "[ALL] 完整构建流程执行完毕"

.PHONY: help build run build-prod test fmt vet lint docker-build docker-up docker-down clean tidy all
