# 变量定义
APP_NAME = cpp12.2.0-hello-world
CPP_VERSION = 12.2.0
BUILD_DIR = build
BINARY_FILE = $(BUILD_DIR)/hello_world
APP_PORT = $(or $(APP_PORT_1),8000)
LOG_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.log
PID_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.pid

# C++编译器设置
CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++17 -O2
LDFLAGS = -pthread

# 默认目标
.PHONY: all
all: install

# 安装命令
.PHONY: install
install:
	@echo "检查 C++ 编译器版本..."
	@$(CXX) --version
	@echo "检查项目是否已编译..."
	@if [ ! -f "$(BINARY_FILE)" ]; then \
		echo "正在编译C++源代码..."; \
		mkdir -p $(BUILD_DIR); \
		$(CXX) $(CXXFLAGS) -o $(BINARY_FILE) hello_world.cpp $(LDFLAGS); \
		echo "✅ C++源代码编译完成"; \
	else \
		echo "✅ C++源代码已编译"; \
	fi
	@echo "✅ 安装完成！C++项目已准备就绪"

# 运行命令（后台运行HTTP服务器）
.PHONY: run
run: install
	@echo "正在启动 C++ HTTP 服务器..."
	@mkdir -p $(dir $(LOG_FILE))
	@if [ -f "$(PID_FILE)" ]; then \
		echo "服务器已在运行中，PID: $$(cat $(PID_FILE))"; \
		exit 1; \
	fi
	@echo "启动服务器在端口 $(APP_PORT)..."
	@APP_PORT_1=$(APP_PORT) nohup $(BINARY_FILE) > $(LOG_FILE) 2>&1 & echo $$! > $(PID_FILE)
	@echo "✅ C++ HTTP 服务器已启动，PID: $$(cat $(PID_FILE))"
	@echo "服务器运行在: http://localhost:$(APP_PORT)/"
	@echo "查看日志: tail -f $(LOG_FILE)"

# 停止命令
.PHONY: stop
stop: kill

# 强制杀死所有相关C++进程
.PHONY: kill
kill:
	@echo "正在查找并杀死所有相关的C++进程..."
	@PIDS=$$(ps aux | grep -E "hello_world|$(APP_NAME)" | grep -v grep | awk '{print $$2}'); \
	if [ -n "$$PIDS" ]; then \
		echo "找到相关进程: $$PIDS"; \
		for PID in $$PIDS; do \
			echo "正在杀死进程 $$PID..."; \
			kill -9 $$PID 2>/dev/null || true; \
		done; \
		sleep 1; \
		echo "✅ 所有相关C++进程已被强制停止"; \
	else \
		echo "未找到相关的C++进程"; \
	fi
	@rm -f $(PID_FILE)
	@echo "✅ 强制停止操作完成"

# 重启命令
.PHONY: restart
restart: stop run

# 查看状态
.PHONY: status
status:
	@if [ -f "$(PID_FILE)" ]; then \
		PID=$$(cat $(PID_FILE)); \
		if ps -p $$PID > /dev/null 2>&1; then \
			echo "✅ 服务器正在运行，PID: $$PID"; \
			echo "端口: $(APP_PORT)"; \
			echo "日志: $(LOG_FILE)"; \
		else \
			echo "❌ 服务器未运行（PID文件存在但进程不存在）"; \
			rm -f $(PID_FILE); \
		fi; \
	else \
		echo "❌ 服务器未运行"; \
	fi

# 开发模式运行
.PHONY: dev
dev:
	@echo "开发模式运行C++程序..."
	@APP_PORT_1=$(APP_PORT) $(BINARY_FILE)

# 调试模式编译
.PHONY: debug
debug:
	@echo "调试模式编译C++程序..."
	@mkdir -p $(BUILD_DIR)
	@$(CXX) $(CXXFLAGS) -g -DDEBUG -o $(BINARY_FILE) hello_world.cpp $(LDFLAGS)
	@echo "✅ 调试版本编译完成"

# 清理编译文件
.PHONY: clean
clean:
	@echo "清理编译文件..."
	rm -rf $(BUILD_DIR)
	@echo "清理完成!"

# 显示帮助信息
.PHONY: help
help:
	@echo "C++ 12.2.0 HTTP 服务器项目"
	@echo ""
	@echo "可用命令:"
	@echo "  make install      - 安装依赖并编译项目"
	@echo "  make run          - 启动HTTP服务器（后台运行）"
	@echo "  make stop         - 停止HTTP服务器（优雅停止）"
	@echo "  make kill         - 强制杀死所有相关C++进程"
	@echo "  make restart      - 重启HTTP服务器"
	@echo "  make status       - 查看服务器状态"
	@echo "  make dev          - 开发模式运行"
	@echo "  make debug        - 调试模式编译"
	@echo "  make clean        - 清理编译文件"
	@echo "  make help         - 显示此帮助信息"
	@echo ""
	@echo "示例:"
	@echo "  make run          # 启动服务器"
	@echo "  make status       # 查看状态"
	@echo "  make stop         # 优雅停止服务器"
	@echo "  make kill         # 强制停止所有相关进程"
	@echo "  make restart      # 重启服务器"
	@echo "  make dev          # 开发模式运行"
	@echo "  make debug        # 编译调试版本"
	@echo ""
	@echo "环境变量:"
	@echo "  APP_PORT_1        - 服务器端口（默认: 8000）"
