"""실제 Gar를 사용한 인터페이스 리뷰 통합 테스트.

이 테스트는 실제 LLM 서버 없이도 실행 가능한 단위 테스트와,
실제 LLM 서버가 있을 때 실행할 수 있는 통합 테스트를 포함합니다.
"""

import pytest
from pathlib import Path

from gar.core.context import ReviewMode
from gar.core.orchestrator import ReviewOrchestrator


@pytest.mark.integration
def test_interface_review_with_real_llm():
    """실제 LLM 서버를 사용한 인터페이스 리뷰 테스트.
    
    이 테스트는 실제 LLM 서버가 필요하므로 integration 마커가 있습니다.
    실행: uv run pytest -m integration
    """
    fixtures_dir = Path(__file__).parent / "fixtures"
    test_file = fixtures_dir / "sample_code_with_issues.py"
    
    if not test_file.exists():
        pytest.skip("테스트 fixture 파일이 없습니다.")
    
    import os
    orchestrator = ReviewOrchestrator()
    ctx = orchestrator.build_context(
        mode=ReviewMode.INTERFACE,
        files=[test_file],
        model="test-model",  # 실제 모델 이름으로 변경 필요
        temperature=float(os.getenv("GAR_TEMPERATURE", "0.2")),
        max_output_tokens=int(os.getenv("GAR_MAX_OUTPUT_TOKENS", "2048")),
        max_retries=int(os.getenv("GAR_MAX_RETRIES", "3")),
        language=os.getenv("GAR_LANGUAGE", "Korean"),
        quiet=False,
    )
    
    report = orchestrator.run(ctx)
    
    # 인터페이스 문제가 발견되어야 함
    assert len(report.findings) > 0
    
    # 특정 카테고리의 문제가 있는지 확인
    categories = [f.category for f in report.findings]
    assert any(cat in ("api_contract", "doc_mismatch", "naming") for cat in categories)


def test_interface_review_good_code():
    """문제가 없는 코드에 대한 리뷰 테스트."""
    fixtures_dir = Path(__file__).parent / "fixtures"
    test_file = fixtures_dir / "sample_code_good.py"
    
    if not test_file.exists():
        pytest.skip("테스트 fixture 파일이 없습니다.")
    
    # Analyzer만 테스트 (LLM 없이)
    from gar.reviewers.interface.analyzer import analyze_interface
    
    result = analyze_interface(test_file)
    
    # 인터페이스가 제대로 추출되었는지 확인
    assert "functions" in result
    assert "classes" in result
