# ==============================
# 魂镜 · 统一开发入口（rewrite/1.0）
# 所有本地服务的启动 / 测试 / 数据库迁移统一经本文件；
# Docker 编排（基础设施与应用容器）见 AGENTS.md「开发命令」与 docker/README.md。
# ==============================

GREEN  := \033[0;32m
YELLOW := \033[0;33m
NC     := \033[0m

.PHONY: help \
  dev-backend dev-shenshi dev-bff dev-frontend dev-sandbox dev-tianmu dev-yuanqi dev-core dev-all \
  db-upgrade db-downgrade db-revision db-current \
  test test-backend test-shenshi test-bff test-frontend \
  vet-shenshi typecheck-bff \
  infra-up app-up app-down \
  clean clean-all clean-pyc clean-pytest clean-mypy clean-empty-dirs clean-dry-run

# 默认目标
help:
	@echo "$(GREEN)魂镜统一开发入口$(NC)"
	@echo ""
	@echo "$(YELLOW)服务启动（开发）$(NC)"
	@echo "  make dev-backend     灵台（uvicorn 热重载，:8000）"
	@echo "  make dev-shenshi     神识（go run，:8080）"
	@echo "  make dev-bff         照壁（tsx watch，:3000）"
	@echo "  make dev-frontend    琉璃镜（next dev，:3001）"
	@echo "  make dev-sandbox     乾坤沙箱（cargo run，:8090）"
	@echo "  make dev-tianmu      天目 OCR（:8101，可选）"
	@echo "  make dev-yuanqi      元炁本地推理（:11434，可选）"
	@echo "  make dev-core        核心三服务并行（灵台+神识+照壁）"
	@echo "  make dev-all         前述全部并行（不含沙箱/天目/元炁）"
	@echo ""
	@echo "$(YELLOW)数据库（Alembic，迁移编号 000/001/002…）$(NC)"
	@echo "  make db-upgrade      升级到最新（head）"
	@echo "  make db-downgrade    回退一步"
	@echo "  make db-revision m=\"说明\"  生成下一号迁移（自动编号+autogenerate）"
	@echo "  make db-current      查看当前版本"
	@echo ""
	@echo "$(YELLOW)测试与检查$(NC)"
	@echo "  make test            全部（后端+神识+照壁+前端）"
	@echo "  make test-backend / test-shenshi / test-bff / test-frontend"
	@echo "  make vet-shenshi     go vet"
	@echo "  make typecheck-bff   tsc --noEmit"
	@echo ""
	@echo "$(YELLOW)Docker 编排快捷方式$(NC)"
	@echo "  make infra-up / app-up / app-down"
	@echo ""
	@echo "$(YELLOW)清理$(NC)"
	@echo "  make clean / clean-all / clean-dry-run"

# ============================== 服务启动（开发） ==============================

dev-backend:
	cd backend && uv run python -m app.main

dev-shenshi:
	cd shenshi && go run .

dev-bff:
	cd bff && npm run dev

dev-frontend:
	cd frontend && pnpm dev

dev-sandbox:
	cd sandbox && cargo run

dev-tianmu:
	cd tianmu && uv run tianmu

dev-yuanqi:
	cd yuanqi && uv run uvicorn src.main:app

# 核心三服务并行：灵台 + 神识 + 照壁（M0 验收链路）
dev-core:
	$(MAKE) -j3 dev-backend dev-shenshi dev-bff

dev-all:
	$(MAKE) -j4 dev-backend dev-shenshi dev-bff dev-frontend

# ============================== 数据库（Alembic） ==============================

# 迁移约定：revision id 与文件名前缀用三位顺序号（000、001、002…），生成统一走
# `make db-revision`（自动取最大号+1 并传 --rev-id）；不要手写哈希 id。
db-upgrade:
	cd backend && uv run alembic upgrade head

db-downgrade:
	cd backend && uv run alembic downgrade -1

db-revision:
	@next=$$(ls backend/alembic/versions 2>/dev/null | grep -E '^[0-9][0-9][0-9]_.*\.py$$' | cut -c1-3 | sort -n | tail -1); \
	if [ -z "$$next" ]; then echo "未找到顺序编号迁移，请先确认基线 000 存在"; exit 1; fi; \
	next=$$(printf '%03d' $$((10#$$next + 1))); \
	echo "$(GREEN)生成迁移 $(NC)$$next：$(m)"; \
	cd backend && uv run alembic revision --autogenerate --rev-id $$next -m "$(m)"

db-current:
	cd backend && uv run alembic current

# ============================== 测试与检查 ==============================

test-backend:
	cd backend && uv run pytest -q

test-shenshi:
	cd shenshi && go test ./...

test-bff:
	cd bff && npm test --silent

test-frontend:
	cd frontend && pnpm test

test: test-backend test-shenshi test-bff test-frontend

vet-shenshi:
	cd shenshi && go vet ./...

typecheck-bff:
	cd bff && npm run type-check --silent

# ============================== Docker 编排快捷方式 ==============================

infra-up:
	docker compose -f docker/docker-compose.infra.yml up -d

app-up:
	docker compose -f docker/docker-compose.app.yml up -d --build

app-down:
	docker compose -f docker/docker-compose.app.yml down

# ============================== 清理（保留原有能力） ==============================

clean: clean-pyc clean-pytest clean-mypy clean-empty-dirs
	@echo "$(GREEN)✓ Cleanup completed successfully!$(NC)"

clean-pyc:
	@echo "$(YELLOW)Removing Python cache files...$(NC)"
	@find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
	@find . -type f -name "*.pyc" -delete 2>/dev/null || true
	@find . -type f -name "*.pyo" -delete 2>/dev/null || true
	@find . -type f -name "*.pyd" -delete 2>/dev/null || true
	@echo "$(GREEN)✓ Python cache files removed$(NC)"

clean-pytest:
	@echo "$(YELLOW)Removing pytest cache...$(NC)"
	@rm -rf .pytest_cache 2>/dev/null || true
	@find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
	@echo "$(GREEN)✓ Pytest cache removed$(NC)"

clean-mypy:
	@echo "$(YELLOW)Removing mypy cache...$(NC)"
	@rm -rf .mypy_cache 2>/dev/null || true
	@find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
	@echo "$(GREEN)✓ Mypy cache removed$(NC)"

clean-empty-dirs:
	@echo "$(YELLOW)Removing empty directories...$(NC)"
	@find . -type d -empty -not -path "./.git/*" -not -path "./.venv/*" -not -path "./venv/*" -not -path "./env/*" -not -path "./.env/*" -delete 2>/dev/null || true
	@find . -type d -empty -not -path "./.git/*" -not -path "./.venv/*" -not -path "./venv/*" -not -path "./env/*" -not -path "./.env/*" -delete 2>/dev/null || true
	@echo "$(GREEN)✓ Empty directories removed$(NC)"

clean-all: clean
	@echo "$(YELLOW)Removing additional files...$(NC)"
	@rm -rf htmlcov .coverage coverage.xml .coverage.* 2>/dev/null || true
	@rm -rf build/ dist/ *.egg-info .eggs/ 2>/dev/null || true
	@find . -type f -name "*.log" -delete 2>/dev/null || true
	@find . -type d -name ".ipynb_checkpoints" -exec rm -rf {} + 2>/dev/null || true
	@echo "$(GREEN)✓ Extended cleanup completed!$(NC)"

clean-dry-run:
	@echo "$(YELLOW)Dry run - files that would be deleted (run 'make clean' to delete):$(NC)"
	@find . -type d -name "__pycache__" 2>/dev/null || echo "None"
	@find . -type f -name "*.pyc" 2>/dev/null || echo "None"
	@find . -type d -name ".pytest_cache" 2>/dev/null || echo "None"
	@find . -type d -name ".mypy_cache" 2>/dev/null || echo "None"
