#!/usr/bin/env python3
"""测试运行脚本 - 自动设置测试环境"""

import os
import sys
import subprocess
from pathlib import Path


def setup_test_env():
    """设置测试环境变量"""
    env = {
        "TEST_DB_HOST": os.environ.get("TEST_DB_HOST", "localhost"),
        "TEST_DB_PORT": os.environ.get("TEST_DB_PORT", "5432"),
        "TEST_DB_NAME": os.environ.get("TEST_DB_NAME", "test_memory_db"),
        "TEST_DB_USER": os.environ.get("TEST_DB_USER", "postgres"),
        "TEST_DB_PASSWORD": os.environ.get("TEST_DB_PASSWORD", "test_password"),
    }

    missing_keys = []
    for key in ["OPENAI_API_KEY"]:
        if not os.environ.get(key):
            missing_keys.append(key)

    if missing_keys:
        print(f"警告: 缺少环境变量: {', '.join(missing_keys)}")
        print("请设置以下环境变量:")
        print("  export OPENAI_API_KEY=your_api_key")
        print("\n或者使用测试模式(跳过需要API密钥的测试):")
        print("  python run_tests.py --skip-api")
        return False

    return True


def run_tests(args):
    """运行测试"""
    pytest_args = ["python", "-m", "pytest", "tests/"]

    if args.verbose:
        pytest_args.append("-v")

    if args.coverage:
        pytest_args.extend(["--cov=src", "--cov-report=term-missing"])

    if args.unit_only:
        pytest_args.append("tests/unit/")
    elif args.integration_only:
        pytest_args.append("tests/integration/")

    if args.marker:
        pytest_args.extend(["-m", args.marker])

    if args.skip_api:
        pytest_args.append("-m")
        pytest_args.append("not requires_openai")

    if args.file:
        pytest_args.append(args.file)

    print(f"运行测试: {' '.join(pytest_args)}")
    return subprocess.run(pytest_args)


def main():
    import argparse

    parser = argparse.ArgumentParser(description="oG-Memory 测试运行器")
    parser.add_argument("-v", "--verbose", action="store_true", help="显示详细输出")
    parser.add_argument(
        "-c", "--coverage", action="store_true", help="生成测试覆盖率报告"
    )
    parser.add_argument("-u", "--unit-only", action="store_true", help="只运行单元测试")
    parser.add_argument(
        "-i", "--integration-only", action="store_true", help="只运行集成测试"
    )
    parser.add_argument("-m", "--marker", help="使用测试标记")
    parser.add_argument(
        "--skip-api", action="store_true", help="跳过需要 OpenAI API 的测试"
    )
    parser.add_argument("-f", "--file", help="运行特定的测试文件")

    args = parser.parse_args()

    if not setup_test_env():
        sys.exit(1)

    result = run_tests(args)
    sys.exit(result.returncode)


if __name__ == "__main__":
    main()