"""
통합 테스트: dispatch.py - check_batch_completion
task-1837_5.1 - 엔키 작성
"""

import json
import sys
from pathlib import Path

sys.path.insert(0, "/home/jay/workspace")


def _write_timers(tmp_path: Path, data: dict) -> None:
    """task-timers.json을 tmp_path/memory/ 에 작성."""
    memory = tmp_path / "memory"
    memory.mkdir(parents=True, exist_ok=True)
    (memory / "task-timers.json").write_text(json.dumps(data), encoding="utf-8")


# ── check_batch_completion ───────────────────────────────────────────────────

def test_batch_completion_no_matching_batch_id(tmp_path, monkeypatch):
    """batch_id가 없는 경우 complete=False, total=0을 반환해야 한다."""
    data = {
        "tasks": {
            "task-1": {"batch_id": "batch-other", "status": "done"},
        }
    }
    _write_timers(tmp_path, data)

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-notexist")
    assert result["complete"] is False
    assert result["total"] == 0
    assert result["done"] == 0
    assert result["pending"] == []


def test_batch_completion_all_done(tmp_path, monkeypatch):
    """모든 task가 done/completed이면 complete=True를 반환해야 한다."""
    data = {
        "tasks": {
            "task-1": {"batch_id": "batch-1", "status": "done"},
            "task-2": {"batch_id": "batch-1", "status": "completed"},
            "task-3": {"batch_id": "batch-other", "status": "running"},
        }
    }
    _write_timers(tmp_path, data)

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-1")
    assert result["complete"] is True
    assert result["total"] == 2
    assert result["done"] == 2
    assert result["pending"] == []


def test_batch_completion_some_running(tmp_path, monkeypatch):
    """일부 task가 running이면 complete=False, pending에 해당 task_id가 포함되어야 한다."""
    data = {
        "tasks": {
            "task-1": {"batch_id": "batch-1", "status": "done"},
            "task-2": {"batch_id": "batch-1", "status": "running"},
        }
    }
    _write_timers(tmp_path, data)

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-1")
    assert result["complete"] is False
    assert result["total"] == 2
    assert result["done"] == 1
    assert "task-2" in result["pending"]


def test_batch_completion_no_timers_file(tmp_path, monkeypatch):
    """task-timers.json이 없으면 complete=False, total=0을 반환해야 한다."""
    (tmp_path / "memory").mkdir(parents=True, exist_ok=True)
    # 파일 없음

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-1")
    assert result["complete"] is False
    assert result["total"] == 0
    assert result["done"] == 0
    assert result["pending"] == []


def test_batch_completion_mixed_statuses(tmp_path, monkeypatch):
    """done/completed/running 혼합 시 정확한 카운팅을 해야 한다."""
    data = {
        "tasks": {
            "task-1": {"batch_id": "batch-2", "status": "done"},
            "task-2": {"batch_id": "batch-2", "status": "completed"},
            "task-3": {"batch_id": "batch-2", "status": "running"},
            "task-4": {"batch_id": "batch-2", "status": "reserved"},
        }
    }
    _write_timers(tmp_path, data)

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-2")
    assert result["complete"] is False
    assert result["total"] == 4
    assert result["done"] == 2
    assert len(result["pending"]) == 2
    assert "task-3" in result["pending"]
    assert "task-4" in result["pending"]


def test_batch_completion_single_task_running(tmp_path, monkeypatch):
    """단일 task가 running이면 complete=False, pending에 해당 task_id 포함."""
    data = {
        "tasks": {
            "task-solo": {"batch_id": "batch-solo", "status": "running"},
        }
    }
    _write_timers(tmp_path, data)

    import dispatch as _d
    monkeypatch.setattr(_d, "WORKSPACE", tmp_path)

    result = _d.check_batch_completion("batch-solo")
    assert result["complete"] is False
    assert result["total"] == 1
    assert result["done"] == 0
    assert "task-solo" in result["pending"]
