.PHONY: all build run test clean docker swagger lint fmt vet

# 应用名称
APP_NAME=ezops
MAIN_FILE=cmd/main.go
BUILD_DIR=build

# Go 参数
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
GOMOD=$(GOCMD) mod

# 版本信息
VERSION=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%Y-%m-%d_%H:%M:%S)
GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
LDFLAGS=-ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT)"

all: test build

# 构建应用
build:
	@echo "Building $(APP_NAME)..."
	@mkdir -p $(BUILD_DIR)
	$(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME) $(MAIN_FILE)
	@echo "Build complete: $(BUILD_DIR)/$(APP_NAME)"

# 运行应用
run:
	$(GOCMD) run $(MAIN_FILE)

# 开发模式运行（带热重载）
dev:
	@which air > /dev/null || go install github.com/cosmtrek/air@latest
	air

# 运行测试
test:
	$(GOTEST) -v ./...

# 运行测试并生成覆盖率报告
test-coverage:
	$(GOTEST) -v -coverprofile=coverage.out ./...
	$(GOCMD) tool cover -html=coverage.out -o coverage.html
	@echo "Coverage report generated: coverage.html"

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

# 下载依赖
deps:
	$(GOMOD) download
	$(GOMOD) tidy

# 更新依赖
update-deps:
	$(GOGET) -u ./...
	$(GOMOD) tidy

# 生成 Swagger 文档
swagger:
	@which swag > /dev/null || go install github.com/swaggo/swag/cmd/swag@latest
	swag init -g $(MAIN_FILE)
	@echo "Swagger docs generated"

# 代码格式化
fmt:
	$(GOCMD) fmt ./...

# 代码检查
vet:
	$(GOCMD) vet ./...

# 运行 linter
lint:
	@which golangci-lint > /dev/null || go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
	golangci-lint run

# 安全检查
security:
	@which gosec > /dev/null || go install github.com/securego/gosec/v2/cmd/gosec@latest
	gosec ./...

# 构建 Docker 镜像
docker-build:
	docker build -t $(APP_NAME):$(VERSION) -t $(APP_NAME):latest .

# 运行 Docker 容器
docker-run:
	docker run -p 8080:8080 -v $(PWD)/config.yaml:/root/config.yaml $(APP_NAME):latest

# 停止 Docker 容器
docker-stop:
	docker stop $(shell docker ps -q --filter ancestor=$(APP_NAME))

# 数据库迁移
migrate:
	$(GOCMD) run $(MAIN_FILE) migrate

# 初始化数据库
init-db:
	@echo "Initializing database..."
	@mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ezops CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null || true
	@echo "Database initialized"

# 生成 Mock 数据
mock:
	$(GOCMD) run scripts/mock.go

# 查看帮助
help:
	@echo "Available targets:"
	@echo "  make build          - Build the application"
	@echo "  make run            - Run the application"
	@echo "  make dev            - Run with hot reload"
	@echo "  make test           - Run tests"
	@echo "  make test-coverage  - Run tests with coverage"
	@echo "  make clean          - Clean build artifacts"
	@echo "  make deps           - Download dependencies"
	@echo "  make update-deps    - Update dependencies"
	@echo "  make swagger        - Generate Swagger docs"
	@echo "  make fmt            - Format code"
	@echo "  make vet            - Run go vet"
	@echo "  make lint           - Run linter"
	@echo "  make security       - Run security check"
	@echo "  make docker-build   - Build Docker image"
	@echo "  make docker-run     - Run Docker container"
	@echo "  make init-db        - Initialize database"
	@echo "  make help           - Show this help"
