# 变量定义
APP_NAME = python-node-demo
NODE = node
NPM = npm
PYTHON = python3
UV = uv
BACKEND_PORT = $(or $(APP_PORT_1),8000)
FRONTEND_PORT = $(or $(APP_PORT_2),8001)
RESOURCE_PATH = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.resource/resource_dev.json
LOG_FILE_BACKEND = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.log
LOG_FILE_FRONTEND = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/frontend.log
PID_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/app.pid
BACKEND_PID_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/backend.pid
FRONTEND_PID_FILE = $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/.logs/frontend.pid

# 安装命令
.PHONY: install
install:
	@echo "检查 Python 版本..."
	@$(PYTHON) --version
	@echo "检查 uv 是否已安装..."
	@if ! command -v $(UV) >/dev/null 2>&1; then \
		echo "❌ 错误：uv 未安装，请先安装 uv"; \
		echo "安装命令：curl -LsSf https://astral.sh/uv/install.sh | sh"; \
		exit 1; \
	fi
	@echo "✅ uv 已安装"
	@echo "检查 Node.js 版本..."
	@$(NODE) --version
	@echo "检查 npm 版本..."
	@$(NPM) --version
	@echo "正在使用 uv 安装Python依赖..."
	@cd backend && $(UV) venv .venv --force
	@cd backend && $(UV) pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
	@echo "正在安装Node.js依赖..."
	@cd frontend && $(NPM) install
	@echo "✅ 依赖安装完成"

# 运行后端
.PHONY: run-backend
run-backend:
	@echo "正在启动Python后端服务..."
	@cd backend && BACKEND_PORT=$(BACKEND_PORT) $(UV) run python app.py > $(LOG_FILE_BACKEND) 2>&1 & echo $$! > $(BACKEND_PID_FILE)
	@echo "✅ Python后端已启动，端口: $(BACKEND_PORT)"

# 运行前端
.PHONY: run-frontend
run-frontend:
	@echo "正在启动Node.js前端服务..."
	@cd frontend && BACKEND_URL=http://localhost:$(BACKEND_PORT) APP_PORT_1=$(FRONTEND_PORT) $(NODE) server.js > $(LOG_FILE_FRONTEND) 2>&1 & echo $$! > $(FRONTEND_PID_FILE)
	@echo "✅ Node.js前端已启动，端口: $(FRONTEND_PORT)"

# 运行所有服务
.PHONY: run
run: run-backend run-frontend
	@echo "✅ 所有服务已启动"
	@echo "前端地址: http://localhost:$(FRONTEND_PORT)"
	@echo "后端API地址: http://localhost:$(BACKEND_PORT)"

# 停止后端
.PHONY: stop-backend
stop-backend:
	@echo "正在停止 Python 后端服务..."
	@if command -v lsof >/dev/null 2>&1; then \
		echo "使用 lsof 命令停止后端..."; \
		lsof -ti:$(BACKEND_PORT) | xargs kill -9 2>/dev/null || echo "没有找到运行在端口 $(BACKEND_PORT) 的进程"; \
	elif command -v ss >/dev/null 2>&1; then \
		echo "使用 ss 命令停止后端..."; \
		ss -ltnp | grep ':$(BACKEND_PORT)' | awk '{print $$7}' | sed 's/.*pid=\([0-9]*\).*/\1/' | xargs kill 2>/dev/null || echo "没有找到运行在端口 $(BACKEND_PORT) 的进程"; \
	elif command -v netstat >/dev/null 2>&1; then \
		echo "使用 netstat 命令停止后端..."; \
		netstat -tlnp 2>/dev/null | grep ':$(BACKEND_PORT)' | awk '{print $$7}' | cut -d'/' -f1 | xargs kill 2>/dev/null || echo "没有找到运行在端口 $(BACKEND_PORT) 的进程"; \
	else \
		echo "❌ 错误：系统中没有找到 lsof、ss 或 netstat 命令"; \
		exit 1; \
	fi
	@echo "✅ Python后端已停止"

.PHONY: stop-frontend
stop-frontend:
	@echo "正在停止 Node.js 前端服务..."
	@if command -v lsof >/dev/null 2>&1; then \
		echo "使用 lsof 命令停止前端..."; \
		lsof -ti:$(FRONTEND_PORT) | xargs kill -9 2>/dev/null || echo "没有找到运行在端口 $(FRONTEND_PORT) 的进程"; \
	elif command -v ss >/dev/null 2>&1; then \
		echo "使用 ss 命令停止前端..."; \
		ss -ltnp | grep ':$(FRONTEND_PORT)' | awk '{print $$7}' | sed 's/.*pid=\([0-9]*\).*/\1/' | xargs kill 2>/dev/null || echo "没有找到运行在端口 $(FRONTEND_PORT) 的进程"; \
	elif command -v netstat >/dev/null 2>&1; then \
		echo "使用 netstat 命令停止前端..."; \
		netstat -tlnp 2>/dev/null | grep ':$(FRONTEND_PORT)' | awk '{print $$7}' | cut -d'/' -f1 | xargs kill 2>/dev/null || echo "没有找到运行在端口 $(FRONTEND_PORT) 的进程"; \
	else \
		echo "❌ 错误：系统中没有找到 lsof、ss 或 netstat 命令"; \
		exit 1; \
	fi
	@echo "✅ Node.js前端已停止"

# 停止所有服务
.PHONY: stop
stop: stop-backend stop-frontend
	@echo "✅ 所有服务已停止"

# 清理命令
.PHONY: clean
clean:
	@echo "正在清理..."
	@rm -rf frontend/node_modules
	@rm -f $(LOG_FILE) $(PID_FILE) $(BACKEND_PID_FILE) $(FRONTEND_PID_FILE)
	@echo "✅ 清理完成"

# 开发模式（使用nodemon）
.PHONY: dev
dev:
	@echo "启动开发模式..."
	@cd frontend && BACKEND_URL=http://localhost:$(BACKEND_PORT) APP_PORT_1=$(FRONTEND_PORT) npx nodemon server.js &
	@cd backend && BACKEND_PORT=$(BACKEND_PORT) $(UV) run python app.py &
	@echo "✅ 开发模式已启动"
	@echo "前端地址: http://localhost:$(FRONTEND_PORT)"
	@echo "后端API地址: http://localhost:$(BACKEND_PORT)"

# 构建Docker镜像
.PHONY: docker-build
docker-build:
	@echo "构建Docker镜像..."
	@docker build -t $(APP_NAME) .
	@echo "✅ Docker镜像构建完成"

# 运行Docker容器
.PHONY: docker-run
docker-run:
	@echo "运行Docker容器..."
	@docker run -p $(FRONTEND_PORT):3000 -p $(BACKEND_PORT):5000 $(APP_NAME)