#!/bin/bash
# UVM 开发环境启动脚本 (Linux/macOS)
# 这个脚本提供了一个简便的方式来在开发环境中运行和测试 UVM 工具。

set -e  # 遇到错误时退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 检查 Python 是否可用
if ! command -v python3 &> /dev/null; then
    echo -e "${RED}❌ 错误: Python3 未安装或不在 PATH 中${NC}"
    exit 1
fi

# 显示帮助信息
show_help() {
    echo
    echo "UVM 开发环境启动脚本"
    echo
    echo "用法:"
    echo "  ./dev.sh setup                    # 设置开发环境"
    echo "  ./dev.sh run list                 # 运行 'uvm list'"
    echo "  ./dev.sh run use tsinghua         # 运行 'uvm use tsinghua'"
    echo "  ./dev.sh test                     # 运行所有测试"
    echo "  ./dev.sh test tests/unit/         # 运行特定测试"
    echo "  ./dev.sh lint                     # 运行代码检查"
    echo "  ./dev.sh check                    # 运行所有检查"
    echo
}

# 运行命令并处理结果
run_command() {
    local cmd="$1"
    local description="$2"
    
    echo
    echo -e "${BLUE}🚀 $description${NC}"
    echo -e "执行: $cmd"
    echo -e "$(printf '=%.0s' {1..50})"
    
    if eval "$cmd"; then
        echo -e "${GREEN}✅ 成功: $description${NC}"
        return 0
    else
        echo -e "${RED}❌ 失败: $description${NC}"
        return 1
    fi
}

# 设置开发环境
setup_dev() {
    echo
    echo -e "${BLUE}🛠️  设置开发环境...${NC}"
    echo
    
    # 检查是否在项目根目录
    if [ ! -f "pyproject.toml" ]; then
        echo -e "${RED}❌ 错误: 请在项目根目录运行此脚本${NC}"
        exit 1
    fi
    
    # 安装开发依赖
    if ! run_command "python3 -m pip install -e '.[dev]'" "安装开发依赖"; then
        exit 1
    fi
    
    # 安装 pre-commit hooks
    run_command "python3 -m pre-commit install" "安装 pre-commit hooks"
    
    echo
    echo -e "${GREEN}✅ 开发环境设置完成!${NC}"
}

# 运行 UVM 工具
run_uvm() {
    if [ $# -eq 0 ]; then
        echo -e "${RED}❌ 错误: 请提供要运行的 UVM 命令${NC}"
        show_help
        exit 1
    fi
    
    echo
    echo -e "${BLUE}🚀 运行 UVM: $*${NC}"
    echo
    
    python3 -m uvm "$@"
}

# 运行测试
run_tests() {
    echo
    echo -e "${BLUE}🧪 运行测试...${NC}"
    echo
    
    if [ $# -eq 0 ]; then
        run_command "python3 -m pytest --cov=uvm --cov-report=term-missing" "运行所有测试"
    else
        run_command "python3 -m pytest --cov=uvm --cov-report=term-missing $*" "运行测试: $*"
    fi
}

# 运行代码检查
run_lint() {
    echo
    echo -e "${BLUE}🔍 运行代码检查...${NC}"
    echo
    
    local success=0
    
    # 运行 ruff 检查
    if ! run_command "python3 -m ruff check --fix ." "Ruff 代码检查"; then
        success=1
    fi
    
    # 运行 ruff 格式化
    run_command "python3 -m ruff format ." "Ruff 代码格式化"
    
    # 运行 mypy 类型检查
    if ! run_command "python3 -m mypy uvm/" "MyPy 类型检查"; then
        success=1
    fi
    
    echo
    if [ $success -eq 0 ]; then
        echo -e "${GREEN}✅ 代码检查完成!${NC}"
    else
        echo -e "${YELLOW}⚠️  代码检查发现问题${NC}"
    fi
    
    return $success
}

# 运行所有检查
run_all_checks() {
    echo
    echo -e "${BLUE}🔍 运行所有代码质量检查...${NC}"
    echo
    
    local overall_success=0
    
    # 运行代码检查
    if ! run_lint; then
        overall_success=1
    fi
    
    # 运行测试覆盖率检查
    echo
    echo -e "${BLUE}🧪 运行测试覆盖率检查...${NC}"
    if ! run_command "python3 -m pytest --cov=uvm --cov-report=term-missing --cov-fail-under=90" "测试覆盖率检查"; then
        overall_success=1
    fi
    
    echo
    if [ $overall_success -eq 0 ]; then
        echo -e "${GREEN}🎉 所有检查通过!${NC}"
    else
        echo -e "${RED}💥 部分检查失败!${NC}"
    fi
    
    return $overall_success
}

# 主逻辑
main() {
    # 如果没有提供参数，显示帮助
    if [ $# -eq 0 ]; then
        show_help
        exit 0
    fi
    
    # 解析命令
    case "$1" in
        "setup")
            setup_dev
            ;;
        "run")
            shift
            run_uvm "$@"
            ;;
        "test")
            shift
            run_tests "$@"
            ;;
        "lint")
            run_lint
            ;;
        "check")
            run_all_checks
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            echo -e "${RED}❌ 错误: 未知命令 '$1'${NC}"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"