"""
test_finish_task_g3_gate.py — finish-task.sh L306~L363 G3 gate 레벨 판정 로직 테스트
작성자: 아르고스 (QA 테스터)
태스크: task-2081
"""

import os
import re

WORKSPACE_ROOT = "/home/jay/workspace"
FINISH_TASK_PATH = os.path.join(WORKSPACE_ROOT, "scripts", "finish-task.sh")


# ---------------------------------------------------------------------------
# 레벨 판정 로직 재현 (finish-task.sh L307-349)
# ---------------------------------------------------------------------------

def resolve_task_level(task_id: str, timers_data: dict | None = None, task_file_content: str | None = None) -> str:
    """finish-task.sh L307-346의 레벨 판정 Python 로직 재현"""
    level = ""

    # 1차: task-timers.json
    if timers_data:
        tasks = timers_data.get("tasks", timers_data)
        t = tasks.get(task_id, {})
        level = (t.get("work_level", "") or "").strip().lower()

    # 2차: task 파일
    if not level and task_file_content:
        m = re.search(r'## 레벨\s*\n(.*?)(?=\n## |\Z)', task_file_content, re.DOTALL)
        if m:
            section = m.group(1).strip().lower()
            if 'critical' in section:
                level = 'critical'
            elif 'security' in section:
                level = 'security'
            elif re.search(r'lv\.?4|level\s*4', section):
                level = 'lv4'
            elif re.search(r'lv\.?3|level\s*3', section):
                level = 'lv3'

    # Lv.3+ 판정
    lv3_keywords = ('critical', 'security', 'lv3', 'lv4', 'lv.3', 'lv.4')
    is_lv3 = any(kw in level for kw in lv3_keywords)
    if not is_lv3 and level:
        is_lv3 = bool(re.search(r'level\s*[34]', level))

    return "lv3plus" if is_lv3 else "below"


# ---------------------------------------------------------------------------
# 테스트 케이스
# ---------------------------------------------------------------------------

def test_level_detection_from_timers_critical():
    """task-timers.json에 work_level='critical' → lv3plus"""
    timers_data = {
        "tasks": {
            "task-2081": {
                "work_level": "critical"
            }
        }
    }
    result = resolve_task_level("task-2081", timers_data=timers_data)
    assert result == "lv3plus"


def test_level_detection_from_timers_normal():
    """task-timers.json에 work_level='normal' → below"""
    timers_data = {
        "tasks": {
            "task-2081": {
                "work_level": "normal"
            }
        }
    }
    result = resolve_task_level("task-2081", timers_data=timers_data)
    assert result == "below"


def test_level_detection_from_timers_security():
    """work_level='security' → lv3plus"""
    timers_data = {
        "tasks": {
            "task-9999": {
                "work_level": "security"
            }
        }
    }
    result = resolve_task_level("task-9999", timers_data=timers_data)
    assert result == "lv3plus"


def test_level_detection_fallback_task_file():
    """work_level='' + task 파일에 ## 레벨\\n- critical → lv3plus"""
    timers_data = {
        "tasks": {
            "task-2081": {
                "work_level": ""
            }
        }
    }
    task_file_content = "# task-2081\n\n## 개요\n작업 내용\n\n## 레벨\n- critical\n\n## 작업 목록\n- 항목1\n"
    result = resolve_task_level(
        "task-2081",
        timers_data=timers_data,
        task_file_content=task_file_content,
    )
    assert result == "lv3plus"


def test_level_detection_lv1_below():
    """work_level='lv1' → below"""
    timers_data = {
        "tasks": {
            "task-2081": {
                "work_level": "lv1"
            }
        }
    }
    result = resolve_task_level("task-2081", timers_data=timers_data)
    assert result == "below"


def test_level_detection_lv2_below():
    """work_level='lv2' → below"""
    timers_data = {
        "tasks": {
            "task-2081": {
                "work_level": "lv2"
            }
        }
    }
    result = resolve_task_level("task-2081", timers_data=timers_data)
    assert result == "below"


def test_g3_gate_section_exists_in_finish_task():
    """finish-task.sh에 'G3-GATE' 문자열이 존재하는지 확인"""
    assert os.path.isfile(FINISH_TASK_PATH), f"finish-task.sh 파일 없음: {FINISH_TASK_PATH}"
    with open(FINISH_TASK_PATH, "r", encoding="utf-8") as f:
        content = f.read()
    assert "G3-GATE" in content, "finish-task.sh에 'G3-GATE' 문자열이 없습니다"


def test_g3_gate_calls_verifier():
    """finish-task.sh에 'g3_independent_verifier.py' 호출이 존재하는지 확인"""
    assert os.path.isfile(FINISH_TASK_PATH), f"finish-task.sh 파일 없음: {FINISH_TASK_PATH}"
    with open(FINISH_TASK_PATH, "r", encoding="utf-8") as f:
        content = f.read()
    assert "g3_independent_verifier.py" in content, \
        "finish-task.sh에 'g3_independent_verifier.py' 호출이 없습니다"
