"""task-1068.1: call_llm() Claude CLI 전환 테스트

run_evals.py의 call_llm() 함수가 API Key → Claude CLI로 전환되었는지 검증합니다.
"""

import subprocess
from unittest.mock import MagicMock, patch

import pytest


class TestCallLlmCliIntegration:
    """call_llm() Claude CLI 통합 테스트."""

    def test_call_llm_uses_subprocess(self) -> None:
        """call_llm()이 subprocess를 사용하는지 확인."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=0,
                stdout="LLM 응답",
                stderr="",
            )

            result = call_llm("테스트 프롬프트")

            # subprocess.run이 호출되었는지 확인
            mock_run.assert_called_once()

            # 호출 인자 확인
            call_args = mock_run.call_args
            assert call_args[0][0][0] == "claude"
            assert call_args[0][0][1] == "-p"
            assert call_args[0][0][2] == "테스트 프롬프트"
            assert "--model" in call_args[0][0]

    def test_call_llm_uses_correct_model(self) -> None:
        """call_llm()이 claude-haiku-4-5-20251001 모델을 사용하는지 확인."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=0,
                stdout="응답",
                stderr="",
            )

            call_llm("프롬프트")

            call_args = mock_run.call_args[0][0]
            model_index = call_args.index("--model") + 1
            assert call_args[model_index] == "claude-haiku-4-5-20251001"

    def test_call_llm_handles_error(self) -> None:
        """call_llm()이 에러를 적절히 처리하는지 확인."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=1,
                stdout="",
                stderr="Error: Claude CLI failed",
            )

            with pytest.raises(RuntimeError) as exc_info:
                call_llm("프롬프트")

            assert "claude CLI 호출 실패" in str(exc_info.value)

    def test_call_llm_strips_output(self) -> None:
        """call_llm()이 출력을 trim하는지 확인."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=0,
                stdout="  응답 내용  \n",
                stderr="",
            )

            result = call_llm("프롬프트")

            assert result == "응답 내용"

    def test_call_llm_has_timeout(self) -> None:
        """call_llm()이 timeout을 설정하는지 확인."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=0,
                stdout="응답",
                stderr="",
            )

            call_llm("프롬프트")

            call_kwargs = mock_run.call_args[1]
            assert "timeout" in call_kwargs
            assert call_kwargs["timeout"] > 0

    def test_call_llm_rate_limit_delay(self) -> None:
        """call_llm()이 rate limit delay를 가지는지 확인."""
        import time

        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            with patch("run_evals.time.sleep") as mock_sleep:
                mock_run.return_value = MagicMock(
                    returncode=0,
                    stdout="응답",
                    stderr="",
                )

                call_llm("프롬프트")

                # time.sleep(1)이 호출되었는지 확인
                mock_sleep.assert_called_once_with(1)


class TestNoAnthropicImport:
    """anthropic SDK 미사용 테스트."""

    def test_no_anthropic_import_in_module(self) -> None:
        """run_evals.py에 anthropic import가 없는지 확인."""
        import run_evals

        # anthropic 모듈이 import되지 않았는지 확인
        assert "anthropic" not in dir(run_evals)

        # 소스 코드에서도 확인
        import inspect

        source = inspect.getsource(run_evals)
        assert "import anthropic" not in source

    def test_no_api_key_usage(self) -> None:
        """call_llm()에서 API Key를 사용하지 않는지 확인."""
        import inspect

        from run_evals import call_llm

        source = inspect.getsource(call_llm)
        assert "ANTHROPIC_API_KEY" not in source
        assert "api_key" not in source.lower() or "no api key" in source.lower()


class TestBackwardCompatibility:
    """후방 호환성 테스트."""

    def test_call_llm_returns_string(self) -> None:
        """call_llm()이 문자열을 반환하는지 확인 (인터페이스 유지)."""
        from run_evals import call_llm

        with patch("run_evals.subprocess.run") as mock_run:
            mock_run.return_value = MagicMock(
                returncode=0,
                stdout="테스트 응답",
                stderr="",
            )

            result = call_llm("프롬프트")

            assert isinstance(result, str)

    def test_call_llm_signature_unchanged(self) -> None:
        """call_llm() 함수 시그니처가 변경되지 않았는지 확인."""
        import inspect

        from run_evals import call_llm

        sig = inspect.signature(call_llm)
        params = list(sig.parameters.keys())

        # 단일 인자 'prompt'만 있어야 함
        assert params == ["prompt"]

    def test_existing_tests_still_pass(self) -> None:
        """기존 테스트가 여전히 통과하는지 확인."""
        # 이 테스트 파일 자체가 기존 테스트이므로
        # pytest가 이 파일을 실행할 때 자동으로 검증됨
        pass
