"""engine_v2/bot_api.py — 봇 호환용 str-반환 래퍼.

기존 engine.py의 call_claude/call_codex/call_gemini과 동일한 시그니처와 반환값(str)을 제공한다.
내부적으로 CLIRunner를 사용한다.
"""

from __future__ import annotations

import re

from engine_v2.cli_runner import CLIResult, CLIRunner


def _filter_error_lines(stderr_text: str, max_length: int = 300) -> str:
    """stderr에서 'error' 포함 줄만 필터링하여 반환한다."""
    lines = stderr_text.splitlines()
    error_lines = [line for line in lines if re.search(r"error", line, re.IGNORECASE)]
    if not error_lines:
        return ""
    filtered = "\n".join(error_lines)
    return filtered[-max_length:]


async def call_claude(prompt: str, timeout: int = 600, code_analysis: bool = False) -> str:
    """Claude CLI 호출 (str 반환).

    .. deprecated::
        engine.py 호환용 래퍼. 신규 코드는 CLIRunner.run_claude()을 직접 사용하세요.
    """
    result = await CLIRunner.run_claude(prompt, timeout=timeout, code_analysis=code_analysis)
    if result.timed_out:
        return f"⏱ 응답 시간 초과 ({timeout}초)"
    if result.returncode != 0 and not result.stdout:
        filtered = _filter_error_lines(result.stderr)
        if filtered:
            return f"❌ Claude CLI 에러 (exit {result.returncode}): {filtered}"
        return f"❌ Claude CLI 에러 (exit {result.returncode}): 상세 내용 없음"
    return result.stdout if result.stdout else "⚠️ Claude CLI에서 빈 응답이 반환되었습니다."


async def call_codex(prompt: str, model: str = "gpt-5.1-codex-mini", timeout: int = 600) -> str:
    """Codex CLI 호출 (str 반환).

    .. deprecated::
        engine.py 호환용 래퍼. 신규 코드는 CLIRunner.run_codex()을 직접 사용하세요.
    """
    result = await CLIRunner.run_codex(prompt, timeout=timeout, model=model)
    if result.timed_out:
        return f"⏱ 응답 시간 초과 ({timeout}초)"
    if result.returncode != 0:
        stderr_lower = result.stderr.lower()
        if "login" in stderr_lower or "auth" in stderr_lower:
            return "🔑 Codex 로그인이 필요합니다. `codex login`을 실행해주세요."
        if "usage limit" in stderr_lower or "hit your" in stderr_lower:
            return "⚠️ Codex 사용량 한도 초과. 잠시 후 다시 시도해주세요."
        filtered = _filter_error_lines(result.stderr)
        if filtered:
            return f"❌ Codex CLI 에러 (exit {result.returncode}): {filtered}"
        return f"❌ Codex CLI 에러 (exit {result.returncode}): 상세 내용 없음"
    return result.stdout if result.stdout else "⚠️ Codex CLI에서 빈 응답이 반환되었습니다."


async def call_gemini(prompt: str, timeout: int = 600) -> str:
    """Gemini CLI 호출 (str 반환).

    .. deprecated::
        engine.py 호환용 래퍼. 신규 코드는 CLIRunner.run_gemini()을 직접 사용하세요.
    """
    result = await CLIRunner.run_gemini(prompt, timeout=timeout)
    if result.timed_out:
        return f"⏱ 응답 시간 초과 ({timeout}초)"
    if result.returncode != 0:
        stderr = result.stderr.strip() if result.stderr else ""
        return f"❌ Gemini CLI 에러 (exit {result.returncode}): {stderr if stderr else '상세 내용 없음'}"
    return result.stdout if result.stdout else "⚠️ Gemini에서 빈 응답이 반환되었습니다."
