# KaboomJS游戏项目 Makefile
# 用于构建、运行和部署KaboomJS游戏

# 变量定义
APP_NAME = kaboomjs-game
NODE_VERSION = 20
MAIN_FILE = index.html
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
DOCKER_IMAGE = $(APP_NAME)
DOCKER_TAG = latest

# Node.js命令
NODE = node
NPM = npm
NPXCMD = npx

# Docker命令
DOCKER = docker

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

# 安装命令
.PHONY: install
install:
	@echo "🎮 初始化 KaboomJS 游戏项目..."
	@echo "检查 Node.js 版本..."
	@$(NODE) --version
	@echo "检查 NPM 版本..."
	@$(NPM) --version
	@echo "安装项目依赖..."
	@if [ -f "package.json" ]; then \
		$(NPM) install; \
		echo "✅ 依赖安装完成"; \
	else \
		echo "❌ package.json 不存在"; \
		exit 1; \
	fi
	@echo "✅ KaboomJS 游戏项目安装完成！"

# 开发模式运行（前台运行，带热重载）
.PHONY: dev
dev: install
	@echo "🚀 启动 KaboomJS 游戏开发服务器..."
	@echo "服务器将在端口 $(APP_PORT) 上运行"
	@echo "浏览器将自动打开游戏页面"
	@echo "按 Ctrl+C 停止服务器"
	@$(NPM) run dev

# 生产模式运行（后台运行）
.PHONY: run
run: install
	@echo "🎮 启动 KaboomJS 游戏服务器（生产模式）..."
	@mkdir -p $(dir $(LOG_FILE))
	@if [ -f "$(PID_FILE)" ]; then \
		echo "服务器已在运行中，PID: $$(cat $(PID_FILE))"; \
		exit 1; \
	fi
	@echo "启动服务器在端口 $(APP_PORT)..."
	@PORT=$(APP_PORT) nohup $(NPM) start > $(LOG_FILE) 2>&1 & echo $$! > $(PID_FILE)
	@sleep 2
	@echo "✅ KaboomJS 游戏服务器已启动，PID: $$(cat $(PID_FILE))"
	@echo "🎯 游戏访问地址: http://localhost:$(APP_PORT)/"
	@echo "📋 查看日志: tail -f $(LOG_FILE)"

# 停止服务器
.PHONY: stop
stop:
	@echo "🛑 停止 KaboomJS 游戏服务器..."
	@if [ -f "$(PID_FILE)" ]; then \
		PID=$$(cat $(PID_FILE)); \
		if ps -p $$PID > /dev/null 2>&1; then \
			echo "正在停止进程 $$PID..."; \
			kill -TERM $$PID; \
			sleep 2; \
			if ps -p $$PID > /dev/null 2>&1; then \
				echo "强制停止进程 $$PID..."; \
				kill -9 $$PID; \
			fi; \
			echo "✅ 服务器已停止"; \
		else \
			echo "服务器进程不存在"; \
		fi; \
		rm -f $(PID_FILE); \
	else \
		echo "服务器未运行"; \
	fi

# 强制停止所有相关进程
.PHONY: kill
kill:
	@echo "🔥 强制停止所有相关的游戏服务器进程..."
	@PIDS=$$(ps aux | grep -E "http-server.*$(APP_PORT)|npm.*start" | 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 "✅ 所有相关进程已被强制停止"; \
	else \
		echo "未找到相关进程"; \
	fi
	@rm -f $(PID_FILE)
	@echo "✅ 强制停止操作完成"

# 重启服务器
.PHONY: restart
restart: stop run

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

# 构建Docker镜像
.PHONY: docker-build
docker-build:
	@echo "🐳 构建 KaboomJS 游戏 Docker 镜像..."
	@$(DOCKER) build -t $(DOCKER_IMAGE):$(DOCKER_TAG) .
	@echo "✅ Docker 镜像构建完成: $(DOCKER_IMAGE):$(DOCKER_TAG)"

# 运行Docker容器
.PHONY: docker-run
docker-run: docker-build
	@echo "🚀 启动 KaboomJS 游戏 Docker 容器..."
	@$(DOCKER) run -d \
		--name $(APP_NAME)-container \
		-p $(APP_PORT):3000 \
		$(DOCKER_IMAGE):$(DOCKER_TAG)
	@echo "✅ Docker 容器已启动"
	@echo "🎯 游戏访问地址: http://localhost:$(APP_PORT)/"

# 停止Docker容器
.PHONY: docker-stop
docker-stop:
	@echo "🛑 停止 KaboomJS 游戏 Docker 容器..."
	@$(DOCKER) stop $(APP_NAME)-container 2>/dev/null || true
	@$(DOCKER) rm $(APP_NAME)-container 2>/dev/null || true
	@echo "✅ Docker 容器已停止并删除"

# 查看Docker容器日志
.PHONY: docker-logs
docker-logs:
	@echo "📋 查看 KaboomJS 游戏 Docker 容器日志..."
	@$(DOCKER) logs -f $(APP_NAME)-container

# 测试游戏
.PHONY: test
test:
	@echo "🧪 测试 KaboomJS 游戏项目..."
	@echo "检查必要文件..."
	@for file in package.json index.html game.js; do \
		if [ -f "$$file" ]; then \
			echo "✅ $$file 存在"; \
		else \
			echo "❌ $$file 不存在"; \
			exit 1; \
		fi; \
	done
	@echo "检查依赖..."
	@$(NPM) list --depth=0 > /dev/null 2>&1 && echo "✅ 依赖检查通过" || echo "⚠️  依赖可能有问题"
	@echo "✅ 测试完成！"

# 清理文件
.PHONY: clean
clean:
	@echo "🧹 清理 KaboomJS 游戏项目文件..."
	@rm -rf node_modules
	@rm -rf .logs
	@rm -rf dist
	@rm -rf build
	@rm -f package-lock.json
	@echo "✅ 清理完成！"

# 完全清理（包括Docker）
.PHONY: clean-all
clean-all: clean docker-stop
	@echo "🧹 完全清理项目和Docker资源..."
	@$(DOCKER) rmi $(DOCKER_IMAGE):$(DOCKER_TAG) 2>/dev/null || true
	@echo "✅ 完全清理完成！"

# 显示项目信息
.PHONY: info
info:
	@echo "🎮 KaboomJS 游戏项目信息"
	@echo "=========================="
	@echo "项目名称: $(APP_NAME)"
	@echo "Node.js版本要求: $(NODE_VERSION)"
	@echo "默认端口: $(APP_PORT)"
	@echo "主文件: $(MAIN_FILE)"
	@echo "游戏文件: game.js"
	@echo "Docker镜像: $(DOCKER_IMAGE):$(DOCKER_TAG)"
	@echo ""
	@if [ -f "package.json" ]; then \
		echo "项目详情:"; \
		$(NODE) -p "const pkg = require('./package.json'); \
		console.log('  名称: ' + pkg.name); \
		console.log('  版本: ' + pkg.version); \
		console.log('  描述: ' + pkg.description);"; \
	fi

# 显示帮助信息
.PHONY: help
help:
	@echo "🎮 KaboomJS 游戏项目 Makefile"
	@echo "============================="
	@echo ""
	@echo "基本命令:"
	@echo "  make install      - 安装项目依赖"
	@echo "  make dev          - 启动开发服务器（前台，热重载）"
	@echo "  make run          - 启动生产服务器（后台运行）"
	@echo "  make stop         - 停止服务器"
	@echo "  make restart      - 重启服务器"
	@echo "  make status       - 查看服务器状态"
	@echo "  make kill         - 强制停止所有相关进程"
	@echo ""
	@echo "Docker命令:"
	@echo "  make docker-build - 构建Docker镜像"
	@echo "  make docker-run   - 运行Docker容器"
	@echo "  make docker-stop  - 停止Docker容器"
	@echo "  make docker-logs  - 查看容器日志"
	@echo ""
	@echo "维护命令:"
	@echo "  make test         - 测试项目"
	@echo "  make clean        - 清理项目文件"
	@echo "  make clean-all    - 完全清理（包括Docker）"
	@echo "  make info         - 显示项目信息"
	@echo "  make help         - 显示此帮助信息"
	@echo ""
	@echo "使用示例:"
	@echo "  make dev          # 开发模式启动游戏"
	@echo "  make run          # 生产模式启动游戏"
	@echo "  make docker-run   # 使用Docker运行游戏"
	@echo "  make status       # 查看游戏服务器状态"
	@echo ""
	@echo "环境变量:"
	@echo "  APP_PORT_1        - 服务器端口（默认: 3000）"
	@echo ""
	@echo "🎯 游戏访问地址: http://localhost:$(APP_PORT)/"
