"""Phase β-2 watchdog verdict 통합 + archived/escalated 영구 박제 회귀 테스트.

task-2387: 회장 stalled 알림 영구 종료를 위한 4건 회귀 테스트.
"""
from __future__ import annotations

import json
import subprocess
from pathlib import Path

import pytest


@pytest.fixture
def fixture_timers_file(tmp_path: Path) -> Path:
    """3개 status (running, archived, escalated)를 가진 임시 task-timers.json"""
    data = {
        "tasks": {
            "task-running": {"status": "running", "team_id": "dev3-team", "start_time": "2026-05-03T01:00:00Z"},
            "task-archived": {"status": "archived", "team_id": "dev3-team", "start_time": "2026-05-03T00:00:00Z"},
            "task-escalated": {"status": "escalated", "team_id": "dev3-team", "start_time": "2026-05-03T00:30:00Z"},
            "task-anu": {"status": "running", "team_id": "anu-direct", "start_time": "2026-05-03T01:00:00Z"},
        }
    }
    p = tmp_path / "task-timers.json"
    p.write_text(json.dumps(data, ensure_ascii=False))
    return p


def _watchdog_jq_query(timers_file: Path) -> list[str]:
    """session-watchdog.sh line 59 jq 쿼리 재현 (Phase β-2 후)"""
    cmd = [
        "jq", "-r",
        '.tasks | to_entries[] | select(.value.status == "running") | '
        'select(.value.status != "archived" and .value.status != "escalated") | '
        'select(.value.team_id != "anu-direct") | .key',
        str(timers_file),
    ]
    result = subprocess.run(cmd, capture_output=True, text=True, check=True)
    return [line for line in result.stdout.strip().split("\n") if line]


def test_archived_task_excluded_from_watchdog(fixture_timers_file: Path) -> None:
    """Fix 1: archived task는 watchdog jq 쿼리에서 제외되어야 한다."""
    keys = _watchdog_jq_query(fixture_timers_file)
    assert "task-archived" not in keys
    assert "task-running" in keys


def test_escalated_task_excluded_from_watchdog(fixture_timers_file: Path) -> None:
    """Fix 1: escalated task는 watchdog jq 쿼리에서 제외되어야 한다."""
    keys = _watchdog_jq_query(fixture_timers_file)
    assert "task-escalated" not in keys
    assert "task-anu" not in keys  # anu-direct도 제외 확인


def test_retry_max_triggers_escalated_status(tmp_path: Path) -> None:
    """Fix 3: jq로 status="escalated" 영구 박제 동작 검증."""
    data = {"tasks": {"task-fail": {"status": "running", "team_id": "dev3-team", "retry_count": 2, "max_retry": 2}}}
    timers = tmp_path / "task-timers.json"
    timers.write_text(json.dumps(data))

    # session-watchdog.sh의 박제 jq 명령 시뮬레이션
    tmp_out = tmp_path / "task-timers.json.tmp"
    subprocess.run(
        ["jq", "--arg", "tid", "task-fail", '.tasks[$tid].status = "escalated"', str(timers)],
        stdout=open(tmp_out, "w"), check=True,
    )
    tmp_out.replace(timers)

    after = json.loads(timers.read_text())
    assert after["tasks"]["task-fail"]["status"] == "escalated"


def test_set_task_status_blocks_archived_and_escalated(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
    """Fix 2: _set_task_status는 archived/escalated를 영구 박제하여 변경을 차단한다."""
    import sys
    sys.path.insert(0, "/home/jay/workspace")
    import dispatch

    data = {
        "tasks": {
            "task-running": {"status": "running"},
            "task-archived": {"status": "archived"},
            "task-escalated": {"status": "escalated"},
        }
    }
    memory_dir = tmp_path / "memory"
    memory_dir.mkdir()
    timers_file = memory_dir / "task-timers.json"
    timers_file.write_text(json.dumps(data))

    monkeypatch.setattr(dispatch, "WORKSPACE", tmp_path)

    assert dispatch._set_task_status("task-archived", "running") is False
    assert dispatch._set_task_status("task-escalated", "running") is False
    assert dispatch._set_task_status("task-running", "completed") is True
    assert dispatch._set_task_status("task-nonexistent", "running") is True
