# 实验二 Makefile：智能台灯（MCP Server）
# 常用：make setup → make doctor → make sim → make check → make stop

PORT ?= 8765
VENV := .venv
PY   := $(VENV)/bin/python
SIM_URL := http://127.0.0.1:$(PORT)

.PHONY: help setup doctor sim stop check test lint flash-demo clean

help:  ## 显示本帮助
	@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN{FS=":.*?## "}{printf "  \033[36m%-12s\033[0m %s\n", $$1, $$2}'

setup:  ## 创建 venv 并安装依赖（mcp / pytest / ruff）
	python3 -m venv $(VENV)
	$(VENV)/bin/pip install -q --upgrade pip
	$(VENV)/bin/pip install -q -r requirements.txt
	@echo "✓ 依赖安装完成"

doctor:  ## 环境自检：venv / 依赖 / 模拟器连通性
	@test -x $(PY) || { echo "✗ 未找到 $(VENV)，先运行 make setup"; exit 1; }
	@echo "✓ Python: $$($(PY) --version)"
	@$(PY) -c "import mcp; print('✓ mcp 已安装')" || { echo "✗ mcp 未安装，运行 make setup"; exit 1; }
	@$(PY) -c "import pytest; print('✓ pytest 已安装')" || { echo "✗ pytest 未安装，运行 make setup"; exit 1; }
	@curl -s -m 2 $(SIM_URL)/state >/dev/null 2>&1 \
		&& echo "✓ 模拟器运行中 ($(SIM_URL))" \
		|| echo "⚠ 模拟器未启动（做 L0 前运行 make sim；make check 不需要）"
	@echo "doctor 完成"

sim:  ## 后台启动开发板模拟器（端口 $(PORT)，日志 .sim.log）
	@curl -s -m 1 $(SIM_URL)/state >/dev/null 2>&1 && { echo "✓ 模拟器已在运行 ($(SIM_URL))"; exit 0; } || true
	@test -x $(PY) || { echo "✗ 先运行 make setup"; exit 1; }
	nohup $(PY) -m simulator serve --port $(PORT) > .sim.log 2>&1 & echo $$! > .sim.pid
	@for i in 1 2 3 4 5 6 7 8 9 10; do \
		curl -s -m 1 $(SIM_URL)/state >/dev/null 2>&1 && break; \
		sleep 0.3; \
	done
	@curl -s -m 1 $(SIM_URL)/state >/dev/null 2>&1 \
		&& echo "✓ 模拟器已启动 ($(SIM_URL), pid $$(cat .sim.pid))，试试: curl $(SIM_URL)/state" \
		|| { echo "✗ 模拟器启动失败，查看 .sim.log"; cat .sim.log; exit 1; }

stop:  ## 停止后台模拟器
	@test -f .sim.pid && kill $$(cat .sim.pid) 2>/dev/null && echo "✓ 已停止 (pid $$(cat .sim.pid))" || echo "（模拟器未在运行）"
	@rm -f .sim.pid

check:  ## 一键验收：跑全部测试（自带进程内模拟器，无需先 make sim）
	@test -x $(PY) || { echo "✗ 先运行 make setup"; exit 1; }
	$(PY) -m pytest tests/ -v

test: check  ## check 的别名

lint:  ## 代码风格检查（ruff）
	@test -x $(VENV)/bin/ruff || { echo "✗ 先运行 make setup"; exit 1; }
	$(VENV)/bin/ruff check .

flash-demo: sim  ## 演示：通过 HTTP 直接烧录并点灯（不经 MCP）
	curl -s -X POST $(SIM_URL)/flash -d '{"name":"demo","code":"# demo"}' | python3 -m json.tool
	curl -s -X POST $(SIM_URL)/gpio_write -d '{"pin":2,"level":1}' | python3 -m json.tool
	curl -s $(SIM_URL)/state | python3 -m json.tool

clean: stop  ## 清理 venv 与缓存
	rm -rf $(VENV) .pytest_cache .ruff_cache __pycache__ */__pycache__ .sim.log
	@echo "✓ 已清理"
