# ChainSQL Makefile
# 项目变量
BINARY_NAME=chainsql
DOCKER_IMAGE=chainsql
VERSION?=$(shell git describe --tags --always 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
LDFLAGS=-ldflags "-w -s -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT)"

# Go 相关变量
GOBASE=$(shell pwd)
GOBIN=$(GOBASE)/bin
GOFILES=$(wildcard *.go)

# 颜色输出
GREEN=\033[0;32m
YELLOW=\033[1;33m
NC=\033[0m # No Color

.PHONY: all build run test clean help
.PHONY: docker-build docker-deploy docker-up docker-down docker-logs docker-clean
.PHONY: db-reset db-clean hardhat-deploy hardhat-test
.PHONY: lint fmt vet tidy deps

# 默认目标
all: build

## Build Commands
build: ## 编译 Go 二进制文件
	@echo "$(GREEN)Building $(BINARY_NAME) $(VERSION)...$(NC)"
	@mkdir -p $(GOBIN)
	@go build $(LDFLAGS) -o $(GOBIN)/$(BINARY_NAME) ./cmd/main.go
	@echo "$(GREEN)✓ Build complete: $(GOBIN)/$(BINARY_NAME)$(NC)"

build-linux: ## 编译 Linux 版本
	@echo "$(GREEN)Building for Linux...$(NC)"
	@mkdir -p $(GOBIN)
	@GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o $(GOBIN)/$(BINARY_NAME)-linux ./cmd/main.go

run: build ## 编译并运行服务
	@echo "$(GREEN)Running $(BINARY_NAME)...$(NC)"
	@$(GOBIN)/$(BINARY_NAME)

## Docker Commands
docker-build: ## 构建 Docker 镜像
	@./scripts/docker-build.sh

docker-deploy: ## 部署 Docker 服务（完整流程）
	@./scripts/docker-deploy.sh

docker-up: ## 启动 Docker Compose 服务
	@echo "$(GREEN)Starting Docker services...$(NC)"
	@docker-compose up -d
	@echo "$(GREEN)✓ Services started$(NC)"

docker-down: ## 停止 Docker Compose 服务
	@echo "$(YELLOW)Stopping Docker services...$(NC)"
	@docker-compose down
	@echo "$(GREEN)✓ Services stopped$(NC)"

docker-restart: ## 重启 ChainSQL 服务
	@echo "$(YELLOW)Restarting ChainSQL...$(NC)"
	@docker-compose restart chainsql

docker-logs: ## 查看 ChainSQL 日志
	@docker-compose logs -f --tail=100 chainsql

docker-logs-db: ## 查看数据库日志
	@docker-compose logs -f --tail=100 postgres

docker-logs-all: ## 查看所有服务日志
	@docker-compose logs -f --tail=100

docker-ps: ## 查看服务状态
	@docker-compose ps

docker-clean: ## 清理 Docker 资源（包括 volumes）
	@echo "$(YELLOW)Cleaning Docker resources...$(NC)"
	@docker-compose down -v
	@docker system prune -f
	@echo "$(GREEN)✓ Docker cleaned$(NC)"

docker-shell: ## 进入 ChainSQL 容器
	@docker-compose exec chainsql sh

docker-db-shell: ## 进入数据库容器
	@docker-compose exec postgres psql -U chainsql

## Database Commands
db-reset: ## 重置数据库游标
	@echo "$(YELLOW)Resetting database cursors...$(NC)"
	@sh scripts/reset-db.sh

db-clean: ## 清空所有 ChainSQL schemas
	@echo "$(YELLOW)Cleaning ChainSQL schemas...$(NC)"
	@sh scripts/clean-schemas.sh

db-backup: ## 备份数据库
	@echo "$(GREEN)Backing up database...$(NC)"
	@docker-compose exec -T postgres pg_dump -U chainsql chainsql | gzip > backup_$(shell date +%Y%m%d_%H%M%S).sql.gz
	@echo "$(GREEN)✓ Backup created$(NC)"

## Hardhat Commands
hardhat-node: ## 启动 Hardhat 本地节点
	@echo "$(GREEN)Starting Hardhat node...$(NC)"
	@cd hardhat && npx hardhat node

hardhat-deploy: ## 部署智能合约到 Hardhat
	@echo "$(GREEN)Deploying contracts...$(NC)"
	@cd hardhat && npx hardhat run scripts/deploy.js --network localhost

hardhat-test: ## 运行 Hardhat 集成测试
	@echo "$(GREEN)Running integration tests...$(NC)"
	@cd hardhat && npx hardhat run scripts/integration-test.js --network localhost

hardhat-compile: ## 编译智能合约
	@echo "$(GREEN)Compiling contracts...$(NC)"
	@cd hardhat && npx hardhat compile

hardhat-clean: ## 清理 Hardhat 编译产物
	@cd hardhat && npx hardhat clean

## Development Commands
test: ## 运行 Go 测试
	@echo "$(GREEN)Running tests...$(NC)"
	@go test -v -race -coverprofile=coverage.out ./...
	@go tool cover -html=coverage.out -o coverage.html
	@echo "$(GREEN)✓ Coverage report: coverage.html$(NC)"

lint: ## 运行 linter
	@echo "$(GREEN)Running linter...$(NC)"
	@golangci-lint run ./...

fmt: ## 格式化代码
	@echo "$(GREEN)Formatting code...$(NC)"
	@go fmt ./...
	@goimports -w .

vet: ## 运行 go vet
	@go vet ./...

tidy: ## 整理依赖
	@echo "$(GREEN)Tidying dependencies...$(NC)"
	@go mod tidy
	@echo "$(GREEN)✓ Dependencies tidied$(NC)"

deps: ## 下载依赖
	@echo "$(GREEN)Downloading dependencies...$(NC)"
	@go mod download

## Cleanup Commands
clean: ## 清理构建产物
	@echo "$(YELLOW)Cleaning build artifacts...$(NC)"
	@rm -rf $(GOBIN)
	@rm -rf coverage.out coverage.html
	@rm -rf logs/*.log
	@echo "$(GREEN)✓ Cleaned$(NC)"

clean-all: clean docker-clean ## 清理所有（包括 Docker）
	@echo "$(GREEN)✓ All cleaned$(NC)"

## Utility Commands
version: ## 显示版本信息
	@echo "Version:    $(VERSION)"
	@echo "Build Time: $(BUILD_TIME)"
	@echo "Git Commit: $(GIT_COMMIT)"

health: ## 检查服务健康状态
	@curl -sf http://localhost:8080/health || echo "Service not healthy"

metrics: ## 查看 Prometheus 指标
	@curl -s http://localhost:8080/metrics

## Quick Start Commands
quickstart: ## 快速启动（Hardhat + ChainSQL）
	@echo "$(GREEN)🚀 Quick Start$(NC)"
	@echo "$(YELLOW)Step 1: Starting Hardhat node...$(NC)"
	@cd hardhat && npx hardhat node &
	@sleep 3
	@echo "$(YELLOW)Step 2: Deploying contracts...$(NC)"
	@$(MAKE) hardhat-deploy
	@echo "$(YELLOW)Step 3: Resetting database...$(NC)"
	@$(MAKE) db-reset
	@echo "$(YELLOW)Step 4: Starting ChainSQL...$(NC)"
	@$(MAKE) run

dev: ## 开发模式（监听文件变化）
	@which air > /dev/null || go install github.com/cosmtrek/air@latest
	@air

## Help
help: ## 显示帮助信息
	@echo "$(GREEN)ChainSQL Makefile Commands:$(NC)"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  $(YELLOW)%-20s$(NC) %s\n", $$1, $$2}'
	@echo ""
	@echo "$(GREEN)Examples:$(NC)"
	@echo "  make build              # 编译项目"
	@echo "  make docker-deploy      # 完整 Docker 部署"
	@echo "  make hardhat-test       # 运行集成测试"
	@echo "  make db-clean           # 清空数据库"
	@echo ""