"""
test_gemini_parser_1970.py — Gemini 코멘트 파서 severity 감지 테스트 (task-1970)

실제 Gemini 코멘트 포맷으로 _parse_gemini_comments가 올바르게 severity를 분류하는지 검증.
"""

import json
import re
import pytest

# worktree_manager.py의 severity 감지 로직만 추출하여 테스트
# (네트워크 의존 없이 파싱 로직만 단위 테스트)


def parse_severity(body_text: str) -> str:
    """worktree_manager.py의 _parse_gemini_comments 내부 severity 감지 로직 복제."""
    severity = "low"
    body_lower = body_text.lower()
    _high_img_re = re.compile(r"!\[(security-critical|critical|high)\]", re.IGNORECASE)
    _medium_img_re = re.compile(r"!\[(medium)\]", re.IGNORECASE)
    if (
        "severity: high" in body_lower
        or "severity: critical" in body_lower
        or "\U0001f534" in body_text  # 🔴
        or "HIGH" in body_text
        or "CRITICAL" in body_text
        or _high_img_re.search(body_text)
        or "high-priority.svg" in body_lower
        or "critical.svg" in body_lower
    ):
        severity = "high"
    elif (
        "severity: medium" in body_lower
        or "\u26a0\ufe0f" in body_text  # ⚠️
        or "MEDIUM" in body_text
        or "WARNING" in body_text
        or _medium_img_re.search(body_text)
        or "medium-priority.svg" in body_lower
    ):
        severity = "medium"
    return severity


class TestGeminiHighDetection:
    """Gemini의 ![high](...) 포맷이 high로 감지되는지 검증."""

    def test_high_markdown_image(self):
        body = "![high](https://www.gstatic.com/codereviewagent/high-priority.svg)\n\nsubprocess.run은 동기식 호출입니다."
        assert parse_severity(body) == "high"

    def test_security_critical_markdown_image(self):
        body = "![security-critical](https://www.gstatic.com/codereviewagent/critical.svg) ![critical](https://www.gstatic.com/codereviewagent/critical.svg)\n\nAPI 키 노출"
        assert parse_severity(body) == "high"

    def test_critical_markdown_image(self):
        body = "![critical](https://www.gstatic.com/codereviewagent/critical.svg)\n\n보안 취약점 발견"
        assert parse_severity(body) == "high"

    def test_high_priority_svg_url(self):
        body = "Some text with high-priority.svg in the URL\n\nDescription of issue"
        assert parse_severity(body) == "high"

    def test_critical_svg_url(self):
        body = "Issue with critical.svg severity badge\n\nDetails"
        assert parse_severity(body) == "high"

    def test_uppercase_HIGH(self):
        body = "severity: HIGH\n\nThis is a serious bug."
        assert parse_severity(body) == "high"

    def test_uppercase_CRITICAL(self):
        body = "severity: CRITICAL\n\nSecurity vulnerability."
        assert parse_severity(body) == "high"

    def test_severity_colon_high(self):
        body = "severity: high\n\nIssue description."
        assert parse_severity(body) == "high"

    def test_severity_colon_critical(self):
        body = "severity: critical\n\nDetails."
        assert parse_severity(body) == "high"

    def test_red_circle_emoji(self):
        body = "🔴 Critical issue found."
        assert parse_severity(body) == "high"


class TestGeminiMediumDetection:
    """Gemini의 ![medium](...) 포맷이 medium으로 감지되는지 검증."""

    def test_medium_markdown_image(self):
        body = "![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)\n\nAsyncClient 매번 생성"
        assert parse_severity(body) == "medium"

    def test_medium_priority_svg_url(self):
        body = "Text with medium-priority.svg badge\n\nPerformance suggestion"
        assert parse_severity(body) == "medium"

    def test_uppercase_MEDIUM(self):
        body = "severity: MEDIUM\n\nMinor issue."
        assert parse_severity(body) == "medium"

    def test_warning_emoji(self):
        body = "⚠️ Consider refactoring this."
        assert parse_severity(body) == "medium"


class TestGeminiLowDetection:
    """severity 표시가 없는 코멘트는 low로 분류되는지 검증."""

    def test_plain_comment(self):
        body = "Consider adding a docstring here for better documentation."
        assert parse_severity(body) == "low"

    def test_suggestion_only(self):
        body = "![low](https://www.gstatic.com/codereviewagent/low-priority.svg)\n\nMinor style issue."
        assert parse_severity(body) == "low"

    def test_empty_body(self):
        assert parse_severity("") == "low"


class TestRealGeminiComments:
    """task-1964에서 실제로 발생한 Gemini 코멘트 포맷 재현 테스트."""

    def test_insuro_pr1_security_critical(self):
        """InsuRo PR #1 코멘트 1번: security-critical + critical"""
        body = (
            "![security-critical](https://www.gstatic.com/codereviewagent/critical.svg) "
            "![critical](https://www.gstatic.com/codereviewagent/critical.svg)\n\n"
            "API 키가 request body에 평문으로 전달되고 있습니다. "
            "이는 로그, 네트워크 스니핑, 브라우저 히스토리 등을 통해 노출될 수 있습니다."
        )
        assert parse_severity(body) == "high"

    def test_insuro_pr1_high_subprocess(self):
        """InsuRo PR #1 코멘트 2번: high (subprocess.run 블로킹)"""
        body = (
            "![high](https://www.gstatic.com/codereviewagent/high-priority.svg)\n\n"
            "subprocess.run은 동기식 호출로, async endpoint에서 이벤트 루프를 블로킹합니다. "
            "asyncio.create_subprocess_exec 또는 run_in_executor를 사용하세요."
        )
        assert parse_severity(body) == "high"

    def test_insuro_pr1_medium_asyncclient(self):
        """InsuRo PR #1 코멘트 6번: medium (AsyncClient 비효율)"""
        body = (
            "![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)\n\n"
            "AsyncClient를 매 요청마다 생성하는 것은 비효율적입니다. "
            "앱 레벨에서 공유 클라이언트를 사용하세요."
        )
        assert parse_severity(body) == "medium"
