"""
Python Test Discovery

Functions for discovering Python and BQAS tests in a codebase.
"""

import json
from pathlib import Path
from typing import List

from ...models import TestCase, TestFramework, TestCategory
from ..config import PROJECT_ROOT


def discover_python_tests(base_path: Path) -> List[TestCase]:
    """Entdeckt Python-Tests in einem Verzeichnis"""
    tests = []
    if not base_path.exists():
        return tests

    # Suche nach test_*.py Dateien
    test_files = list(base_path.rglob("test_*.py"))

    for test_file in test_files:
        try:
            content = test_file.read_text()
            for i, line in enumerate(content.split("\n"), 1):
                stripped = line.strip()
                # Test-Funktionen
                if stripped.startswith("def test_"):
                    name_end = stripped.find("(")
                    if name_end > 4:
                        func_name = stripped[4:name_end]
                        tests.append(TestCase(
                            id=f"{test_file.stem}_{func_name}",
                            name=func_name,
                            file_path=str(test_file.relative_to(PROJECT_ROOT)),
                            line_number=i,
                            framework=TestFramework.PYTEST,
                            category=TestCategory.UNIT,
                        ))
                # Async Test-Methoden
                elif stripped.startswith("async def test_"):
                    name_end = stripped.find("(")
                    if name_end > 10:
                        func_name = stripped[10:name_end]
                        tests.append(TestCase(
                            id=f"{test_file.stem}_{func_name}",
                            name=func_name,
                            file_path=str(test_file.relative_to(PROJECT_ROOT)),
                            line_number=i,
                            framework=TestFramework.PYTEST,
                            category=TestCategory.UNIT,
                        ))
        except Exception:
            pass

    return tests


def discover_bqas_tests(base_path: Path, test_type: str) -> List[TestCase]:
    """Entdeckt BQAS-Tests (Golden/RAG)"""
    tests = []
    if not base_path.exists():
        return tests

    # Suche nach JSON-Dateien
    test_files = list(base_path.rglob("*.json"))

    for test_file in test_files:
        try:
            content = json.loads(test_file.read_text())
            if isinstance(content, list):
                for i, test_case in enumerate(content):
                    test_id = test_case.get("id", f"{test_file.stem}_{i}")
                    tests.append(TestCase(
                        id=test_id,
                        name=test_case.get("name", test_id),
                        file_path=str(test_file.relative_to(PROJECT_ROOT)),
                        framework=TestFramework.BQAS_GOLDEN if test_type == "golden" else TestFramework.BQAS_RAG,
                        category=TestCategory.BQAS,
                    ))
        except Exception:
            pass

    return tests
