"""
tests/test_session_integration.py

TDD RED Phase: 세션 자동 압축 모듈 통합 테스트 (task-1458.1)

테스트 항목:
1. test_dispatch_has_check_sessions_arg: dispatch.py의 argparse에 --check-sessions 인자 확인
2. test_dispatch_check_sessions_returns_json: dispatch.py --check-sessions 실행 시 JSON 반환 확인
3. test_team_prompts_include_session_monitoring: team_prompts.build_prompt()에 세션 모니터링 텍스트 포함
4. test_session_resilience_importable_from_dispatch: dispatch에서 SessionResilience import 가능 확인
5. test_session_auto_compress_importable: SessionAutoCompress 직접 import 가능 확인
6. test_session_resilience_check_all_sessions: SessionResilience.check_all_sessions() 구조 확인
"""

from __future__ import annotations

import json
import os
import subprocess
import sys
from pathlib import Path

_WORKSPACE = Path(os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace"))
if str(_WORKSPACE) not in sys.path:
    sys.path.insert(0, str(_WORKSPACE))


# ──────────────────────────────────────────────────────────────────────────────
# 1. test_dispatch_has_check_sessions_arg
# ──────────────────────────────────────────────────────────────────────────────


def test_dispatch_has_check_sessions_arg() -> None:
    """dispatch.py의 argparse에 --check-sessions 인자 존재 확인"""
    dispatch_path = _WORKSPACE / "dispatch.py"
    assert dispatch_path.exists(), f"dispatch.py not found at {dispatch_path}"

    # dispatch.py --help 실행하여 --check-sessions 확인
    result = subprocess.run(
        [sys.executable, str(dispatch_path), "--help"],
        capture_output=True,
        text=True,
        cwd=str(_WORKSPACE),
        env={**os.environ, "WORKSPACE_ROOT": str(_WORKSPACE)},
        timeout=30,
    )

    assert result.returncode == 0, f"dispatch.py --help failed: {result.stderr}"
    assert "check-sessions" in result.stdout, "dispatch.py --help output does not contain 'check-sessions' argument"


# ──────────────────────────────────────────────────────────────────────────────
# 2. test_dispatch_check_sessions_returns_json
# ──────────────────────────────────────────────────────────────────────────────


def test_dispatch_check_sessions_returns_json() -> None:
    """dispatch.py --check-sessions 실행 시 유효한 JSON 반환 확인"""
    dispatch_path = _WORKSPACE / "dispatch.py"
    assert dispatch_path.exists(), f"dispatch.py not found at {dispatch_path}"

    # dispatch.py --check-sessions 실행
    result = subprocess.run(
        [sys.executable, str(dispatch_path), "--check-sessions"],
        capture_output=True,
        text=True,
        cwd=str(_WORKSPACE),
        env={**os.environ, "WORKSPACE_ROOT": str(_WORKSPACE)},
        timeout=30,
    )

    assert result.returncode == 0, f"dispatch.py --check-sessions failed: {result.stderr}"

    # JSON 파싱 가능 확인
    output = result.stdout.strip()
    assert output, "dispatch.py --check-sessions output is empty"

    data = json.loads(output)  # JSONDecodeError 발생 시 테스트 실패

    # "checked" 키 존재 확인
    assert "checked" in data, f"JSON response missing 'checked' key. Response: {data}"


# ──────────────────────────────────────────────────────────────────────────────
# 3. test_team_prompts_include_session_monitoring
# ──────────────────────────────────────────────────────────────────────────────


def test_team_prompts_include_session_monitoring() -> None:
    """team_prompts.build_prompt()에 세션 모니터링 관련 텍스트 포함 확인"""
    from prompts.team_prompts import build_prompt

    # dev2-team 프롬프트 빌드
    prompt = build_prompt(
        team_id="dev2-team",
        task_id="task-999.1",
        task_desc="테스트 작업입니다.",
        level="normal",
    )

    assert prompt, "build_prompt returned empty string"

    # 세션 모니터링 관련 텍스트 포함 확인 (case-insensitive)
    prompt_lower = prompt.lower()
    has_session_text = "세션 모니터링" in prompt or "session" in prompt_lower or "세션" in prompt

    assert has_session_text, "team_prompts.build_prompt() output does not contain session-related text"


# ──────────────────────────────────────────────────────────────────────────────
# 4. test_session_resilience_importable_from_dispatch
# ──────────────────────────────────────────────────────────────────────────────


def test_session_resilience_importable_from_dispatch() -> None:
    """dispatch 모듈에서 SessionResilience import 가능성 확인"""
    import dispatch

    # dispatch 모듈이 _SESSION_RESILIENCE_AVAILABLE 속성 보유 확인
    assert hasattr(
        dispatch, "_SESSION_RESILIENCE_AVAILABLE"
    ), "dispatch module does not have '_SESSION_RESILIENCE_AVAILABLE' attribute"

    # _SESSION_RESILIENCE_AVAILABLE가 True인지 확인 (정상 import 상태)
    assert dispatch._SESSION_RESILIENCE_AVAILABLE is True, "dispatch._SESSION_RESILIENCE_AVAILABLE is not True"


# ──────────────────────────────────────────────────────────────────────────────
# 5. test_session_auto_compress_importable
# ──────────────────────────────────────────────────────────────────────────────


def test_session_auto_compress_importable() -> None:
    """session_auto_compress.SessionAutoCompress 직접 import 가능 확인"""
    from utils.session_auto_compress import SessionAutoCompress

    assert SessionAutoCompress is not None, "SessionAutoCompress import failed or returned None"

    # SessionAutoCompress가 클래스인지 확인
    assert isinstance(SessionAutoCompress, type), "SessionAutoCompress is not a class"


# ──────────────────────────────────────────────────────────────────────────────
# 6. test_session_resilience_check_all_sessions
# ──────────────────────────────────────────────────────────────────────────────


def test_session_resilience_check_all_sessions(tmp_path: Path) -> None:
    """SessionResilience.check_all_sessions() 올바른 구조의 dict 반환 확인"""
    from utils.session_resilience import SessionResilience

    # tmp_path에 fake task-timers.json 생성
    memory_dir = tmp_path / "memory"
    memory_dir.mkdir(parents=True, exist_ok=True)

    fake_timers = {
        "tasks": {
            "task-100.1": {
                "task_id": "task-100.1",
                "team_id": "dev2-team",
                "status": "running",
            }
        }
    }
    timers_path = memory_dir / "task-timers.json"
    timers_path.write_text(json.dumps(fake_timers, ensure_ascii=False), encoding="utf-8")

    # token-ledger.json 생성
    fake_ledger = {
        "tasks": {
            "task-100.1": {
                "team_id": "dev2-team",
                "total_tokens": 100000,
            }
        }
    }
    ledger_path = memory_dir / "token-ledger.json"
    ledger_path.write_text(json.dumps(fake_ledger, ensure_ascii=False), encoding="utf-8")

    # SessionResilience 인스턴스 생성
    resilience = SessionResilience(workspace_root=str(tmp_path))

    # check_all_sessions() 호출
    result = resilience.check_all_sessions()

    # 반환값이 dict인지 확인
    assert isinstance(result, dict), f"check_all_sessions() returned {type(result)}, expected dict"

    # 필수 키 존재 확인
    required_keys = {"checked", "warnings", "criticals", "normals"}
    for key in required_keys:
        assert key in result, f"check_all_sessions() response missing required key: {key}"

    # checked는 정수
    assert isinstance(result["checked"], int), f"'checked' value is {type(result['checked'])}, expected int"

    # warnings, criticals는 리스트
    assert isinstance(result["warnings"], list), f"'warnings' value is {type(result['warnings'])}, expected list"
    assert isinstance(result["criticals"], list), f"'criticals' value is {type(result['criticals'])}, expected list"

    # normals는 정수
    assert isinstance(result["normals"], int), f"'normals' value is {type(result['normals'])}, expected int"
