# Makefile - ROS2 项目构建 / 测试 / 启动聚合命令
#
# 设计思想:
#   - 用 make 聚合所有 colcon / docker / 测试命令
#   - 跨平台: Linux/macOS 直接 make;Windows 用 WSL 或 Git Bash
#   - 默认项目: docker compose -p ros2
#
# 使用:
#   make help            # 列出所有命令
#   make build           # build 镜像
#   make up              # 启动容器
#   make down            # 停止容器
#   make colcon-build    # 容器内 build 所有包
#   make colcon-test     # 容器内跑所有测试
#   make launch TOPIC=pubsub
#   make logs
#   make shell

# ---------- 配置 ----------
DOCKER_COMPOSE = docker compose -p ros2 -f docker/docker-compose.yml
CONTAINER = ros2_dev
WORKSPACE = /root/ros2_ws
PACKAGES = py_pubsub cpp_pubsub py_srv py_action_demo cpp_robot_tf2 py_vision_demo \
           py_params cpp_custom_interface py_lifecycle_composable cpp_qos_demo py_overlay_dds \
           bringup

# ---------- 颜色 ----------
GREEN  = \033[0;32m
YELLOW = \033[1;33m
RESET  = \033[0m

.DEFAULT_GOAL := help

.PHONY: help
help: ## 显示所有命令
	@echo "$(GREEN)ROS2 Learning Suite - Makefile$(RESET)"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  $(YELLOW)%-20s$(RESET) %s\n", $$1, $$2}'

# ---------- Docker ----------
.PHONY: build
build: ## 构建镜像(首次 5-10min)
	$(DOCKER_COMPOSE) build

.PHONY: up
up: ## 启动容器(后台)
	$(DOCKER_COMPOSE) up -d

.PHONY: down
down: ## 停止容器
	$(DOCKER_COMPOSE) down

.PHONY: logs
logs: ## 查看容器日志
	$(DOCKER_COMPOSE) logs -f ros2

.PHONY: shell
shell: ## 进入容器开发终端
	$(DOCKER_COMPOSE) exec ros2 bash -lc "source $(WORKSPACE)/install/setup.bash && exec bash"

.PHONY: clean
clean: ## 清理构建产物(build/install/log)
	$(DOCKER_COMPOSE) exec ros2 bash -lc "cd $(WORKSPACE) && rm -rf build/ install/ log/"

# ---------- colcon ----------
.PHONY: colcon-build
colcon-build: ## 容器内 build 所有包
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon build --symlink-install --packages-select $(PACKAGES)"

.PHONY: colcon-test
colcon-test: ## 容器内跑所有包的测试
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon test --packages-select $(PACKAGES)"

.PHONY: colcon-build-one
colcon-build-one: ## build 单包: make colcon-build-one PKG=py_pubsub
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon build --symlink-install --packages-select $(PKG)"

.PHONY: colcon-test-one
colcon-test-one: ## 测单包: make colcon-test-one PKG=py_pubsub
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon test --packages-select $(PKG)"

# ---------- Launch (端到端 demo) ----------
.PHONY: launch
launch: ## 启动 launch: make launch NAME=pubsub_launch
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source $(WORKSPACE)/install/setup.bash && ros2 launch bringup $(NAME).py"

.PHONY: full-demo
full-demo: ## 启动 11 节点 full_demo
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source $(WORKSPACE)/install/setup.bash && ros2 launch bringup full_demo_launch.py"

# ---------- venv (本机开发) ----------
.PHONY: venv-setup
venv-setup: ## 本机创建 Python venv(不污染系统 Python)
	powershell -ExecutionPolicy Bypass -File tools/setup_venv.ps1

.PHONY: venv-activate
venv-activate: ## 提示如何激活 venv
	@echo "运行: powershell -ExecutionPolicy Bypass -File tools/setup_venv.ps1"
	@echo "然后: .\\.venv\\Scripts\\Activate.ps1"

# ---------- 维护 ----------
.PHONY: lint
lint: ## 容器内跑 ruff + flake8(代码风格)
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && ruff check src/ || true"

.PHONY: format
format: ## 容器内跑 black(代码格式化)
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && black src/ || true"

.PHONY: status
status: ## 显示所有节点 / topic / service / action
	$(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "source $(WORKSPACE)/install/setup.bash && ros2 node list && ros2 topic list && ros2 service list && ros2 action list"