#!/usr/bin/env python3
"""UVM 开发环境启动脚本

这个脚本提供了一个简便的方式来在开发环境中运行和测试 UVM 工具。
"""

import os
import sys
import subprocess
import argparse
from pathlib import Path


def run_command(cmd, description=""):
    """运行命令并处理结果"""
    print(f"\n🚀 {description}")
    print(f"执行: {' '.join(cmd)}")
    print("-" * 50)
    
    try:
        result = subprocess.run(cmd, check=True)
        print(f"✅ 成功: {description}")
        return True
    except subprocess.CalledProcessError as e:
        print(f"❌ 失败: {description} (退出码: {e.returncode})")
        return False
    except FileNotFoundError:
        print(f"❌ 命令未找到: {cmd[0]}")
        return False


def install_dev_deps():
    """安装开发依赖"""
    return run_command(
        [sys.executable, "-m", "pip", "install", "-e", ".[dev]"],
        "安装开发依赖"
    )


def run_uvm(args):
    """运行 UVM 工具"""
    cmd = [sys.executable, "-m", "uvm"] + args
    return run_command(cmd, f"运行 UVM: {' '.join(args)}")


def run_tests(test_args=None):
    """运行测试"""
    if test_args is None:
        test_args = []
    
    cmd = [sys.executable, "-m", "pytest", "--cov=uvm", "--cov-report=term-missing"] + test_args
    return run_command(cmd, f"运行测试: {' '.join(test_args)}")


def run_lint():
    """运行代码检查"""
    success = True
    
    # 运行 ruff 检查
    success &= run_command([sys.executable, "-m", "ruff", "check", "--fix", "."], "Ruff 代码检查")
    
    # 运行 ruff 格式化
    success &= run_command([sys.executable, "-m", "ruff", "format", "."], "Ruff 代码格式化")
    
    # 运行 mypy 类型检查
    success &= run_command([sys.executable, "-m", "mypy", "uvm/"], "MyPy 类型检查")
    
    return success


def run_all_checks():
    """运行所有检查"""
    print("\n🔍 运行所有代码质量检查...")
    
    success = True
    success &= run_lint()
    success &= run_tests(["--cov-fail-under=90"])
    
    if success:
        print("\n🎉 所有检查通过!")
    else:
        print("\n💥 部分检查失败!")
    
    return success


def setup_dev_env():
    """设置开发环境"""
    print("\n🛠️  设置开发环境...")
    
    # 检查是否在项目根目录
    if not Path("pyproject.toml").exists():
        print("❌ 错误: 请在项目根目录运行此脚本")
        return False
    
    # 安装开发依赖
    if not install_dev_deps():
        return False
    
    # 安装 pre-commit hooks
    run_command([sys.executable, "-m", "pre-commit", "install"], "安装 pre-commit hooks")
    
    print("\n✅ 开发环境设置完成!")
    return True


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="UVM 开发环境启动脚本",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  python dev.py setup                    # 设置开发环境
  python dev.py run list                 # 运行 'uvm list'
  python dev.py run use tsinghua         # 运行 'uvm use tsinghua'
  python dev.py test                     # 运行所有测试
  python dev.py test tests/unit/         # 运行特定测试
  python dev.py lint                     # 运行代码检查
  python dev.py check                    # 运行所有检查
        """
    )
    
    subparsers = parser.add_subparsers(dest="command", help="可用命令")
    
    # setup 命令
    subparsers.add_parser("setup", help="设置开发环境")
    
    # run 命令
    run_parser = subparsers.add_parser("run", help="运行 UVM 命令")
    run_parser.add_argument("args", nargs="*", help="传递给 UVM 的参数")
    
    # test 命令
    test_parser = subparsers.add_parser("test", help="运行测试")
    test_parser.add_argument("args", nargs="*", help="传递给 pytest 的参数")
    
    # lint 命令
    subparsers.add_parser("lint", help="运行代码检查")
    
    # check 命令
    subparsers.add_parser("check", help="运行所有检查")
    
    # 如果没有提供参数，显示帮助
    if len(sys.argv) == 1:
        parser.print_help()
        return
    
    args = parser.parse_args()
    
    # 执行对应命令
    if args.command == "setup":
        setup_dev_env()
    elif args.command == "run":
        if not args.args:
            print("❌ 错误: 请提供要运行的 UVM 命令")
            parser.print_help()
        else:
            run_uvm(args.args)
    elif args.command == "test":
        run_tests(args.args)
    elif args.command == "lint":
        run_lint()
    elif args.command == "check":
        run_all_checks()
    else:
        parser.print_help()


if __name__ == "__main__":
    main()