"""task-2463 Phase 3 P0-1: finish-task.sh hard gate 단위 테스트

finish-task.sh가 worktree_manager.py의 @@WORKTREE_FINISH_RESULT@@ sentinel을
파싱하여 status != "merged"일 때 .merge-failed를 생성하고 exit 1하는지 검증.
실제 bash 호출은 복잡하므로, sentinel 파싱 로직을 단위 테스트로 검증한다.
"""
import json
import os
import subprocess
import tempfile


def _parse_sentinel(output_text: str) -> str:
    """finish-task.sh의 WT_STATUS 파싱 로직을 Python으로 재현"""
    for line in output_text.splitlines():
        if "@@WORKTREE_FINISH_RESULT@@" in line:
            json_part = line.split("@@WORKTREE_FINISH_RESULT@@", 1)[1]
            try:
                d = json.loads(json_part)
                return d.get("status", "")
            except json.JSONDecodeError:
                pass
    return "unknown"


def test_sentinel_parse_blocked_by_timeout():
    """blocked_by_timeout sentinel은 'merged'가 아님 → 차단 대상"""
    output = '@@WORKTREE_FINISH_RESULT@@{"status":"blocked_by_timeout","task_id":"task-test"}'
    status = _parse_sentinel(output)
    assert status != "merged"
    assert status == "blocked_by_timeout"


def test_sentinel_parse_merged():
    """status=merged sentinel은 통과"""
    output = '@@WORKTREE_FINISH_RESULT@@{"status":"merged","task_id":"task-test"}'
    status = _parse_sentinel(output)
    assert status == "merged"


def test_sentinel_parse_merge_failed():
    """merge_failed sentinel은 'merged'가 아님 → 차단 대상"""
    output = '@@WORKTREE_FINISH_RESULT@@{"status":"merge_failed","task_id":"task-test"}'
    status = _parse_sentinel(output)
    assert status != "merged"
    assert status == "merge_failed"


def test_sentinel_parse_pending():
    """pending sentinel은 'merged'가 아님 → 차단 대상"""
    output = '@@WORKTREE_FINISH_RESULT@@{"status":"pending","task_id":"task-test"}'
    status = _parse_sentinel(output)
    assert status != "merged"


def test_sentinel_parse_no_sentinel():
    """sentinel 없는 출력 → unknown → 차단 대상"""
    output = '{"status":"merged","task_id":"task-test"}\nsome other output'
    status = _parse_sentinel(output)
    assert status == "unknown"
    assert status != "merged"


def test_sentinel_parse_multiline_output():
    """멀티라인 출력에서 sentinel 라인만 파싱"""
    output = """[INFO] some log
{"status": "blocked_by_high_severity", "task_id": "task-test"}
@@WORKTREE_FINISH_RESULT@@{"status":"blocked_by_high_severity","task_id":"task-test"}
[INFO] more log"""
    status = _parse_sentinel(output)
    assert status == "blocked_by_high_severity"
    assert status != "merged"


def test_bash_sentinel_extraction():
    """실제 bash 파이프라인으로 sentinel 추출 — grep|sed|python3 체인 검증"""
    sentinel_line = '@@WORKTREE_FINISH_RESULT@@{"status":"blocked_by_timeout","task_id":"task-test"}'
    with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f:
        f.write(sentinel_line + "\n")
        tmp_path = f.name

    try:
        cmd = (
            f'grep -F "@@WORKTREE_FINISH_RESULT@@" "{tmp_path}" 2>/dev/null | tail -1 | '
            f'sed \'s|@@WORKTREE_FINISH_RESULT@@||\' | '
            f'python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get(\'status\',\'\'))"'
        )
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
        assert result.returncode == 0
        assert result.stdout.strip() == "blocked_by_timeout"
    finally:
        os.unlink(tmp_path)
