"""
task-194.1 대시보드 상태 불일치 수정 테스트
"""
import sys
import json
from datetime import datetime
from pathlib import Path
from unittest.mock import patch

# server.py 모듈 임포트
sys.path.insert(0, str(Path('/home/jay/workspace/dashboard')))

def test_get_member_status_idle_with_running_task():
    """member-status.json이 idle이고 team에 running task가 있을 때 팀장은 working, 팀원은 standby"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))

    # member-status.json 데이터 시뮬레이션
    loader.member_status_data = {
        "members": {
            "hermes": {"status": "idle", "since": "2026-03-03T03:17:48Z", "task": None},
            "vulcan": {"status": "idle", "since": "2026-03-03T07:36:40Z", "task": None},
        }
    }

    running_tasks = {
        "dev1-team": [{"task_id": "task-194.1", "description": "test", "start_time": datetime.now().isoformat()}]
    }

    # 팀장 (is_lead=True) → running task 있으면 working
    lead_member = {"id": "hermes", "name": "헤르메스", "status": "idle"}
    result = loader.get_member_status(lead_member, "dev1-team", running_tasks, is_lead=True)
    assert result == "working", f"팀장은 working이어야 함, got: {result}"

    # 팀원 (is_lead=False) → running task 있으면 standby
    member = {"id": "vulcan", "name": "불칸", "status": "idle"}
    result = loader.get_member_status(member, "dev1-team", running_tasks, is_lead=False)
    assert result == "standby", f"팀원은 standby이어야 함, got: {result}"

    print("✅ test_get_member_status_idle_with_running_task PASSED")

def test_get_member_status_idle_without_running_task():
    """member-status.json이 idle이고 running task 없으면 idle 유지"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))

    loader.member_status_data = {
        "members": {
            "hermes": {"status": "idle", "since": "2026-03-03T03:17:48Z", "task": None},
        }
    }

    running_tasks = {}  # 진행중 작업 없음

    lead_member = {"id": "hermes", "name": "헤르메스", "status": "idle"}
    result = loader.get_member_status(lead_member, "dev1-team", running_tasks, is_lead=True)
    assert result == "idle", f"running task 없으면 idle이어야 함, got: {result}"

    print("✅ test_get_member_status_idle_without_running_task PASSED")

def test_get_member_status_break_preserved():
    """break 상태는 running task와 무관하게 유지"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))

    loader.member_status_data = {
        "members": {
            "hermes": {"status": "break", "since": "2026-03-03T03:17:48Z", "task": None},
        }
    }

    running_tasks = {
        "dev1-team": [{"task_id": "task-194.1", "description": "test", "start_time": datetime.now().isoformat()}]
    }

    # break은 org 데이터의 status 필드에서 처리됨 → member-status.json의 break은 별도 경로
    # member-status.json에서 "break"이면 explicit_status != "idle"이므로 바로 반환
    lead_member = {"id": "hermes", "name": "헤르메스", "status": "idle"}
    result = loader.get_member_status(lead_member, "dev1-team", running_tasks, is_lead=True)
    assert result == "break", f"break은 유지되어야 함, got: {result}"

    print("✅ test_get_member_status_break_preserved PASSED")

def test_get_member_status_working_preserved():
    """working 상태는 유지"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))

    loader.member_status_data = {
        "members": {
            "hermes": {"status": "working", "since": datetime.now().isoformat(), "task": "some task"},
        }
    }

    running_tasks = {}  # running task 없어도

    lead_member = {"id": "hermes", "name": "헤르메스", "status": "idle"}
    result = loader.get_member_status(lead_member, "dev1-team", running_tasks, is_lead=True)
    assert result == "working", f"명시적 working은 유지되어야 함, got: {result}"

    print("✅ test_get_member_status_working_preserved PASSED")

def test_get_team_stats_with_running_tasks():
    """running task가 있으면 stats.working이 0이 아니어야 함"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))

    # 실제 데이터 로드
    loader.reload_all(max_age_seconds=0)

    stats = loader.get_team_stats()
    running_by_team = loader.get_running_tasks_by_team()

    running_count = sum(len(v) for v in running_by_team.values())

    if running_count > 0:
        assert stats["working"] > 0, f"running task {running_count}건인데 working이 0임! stats={stats}"
        print(f"✅ test_get_team_stats_with_running_tasks PASSED (running={running_count}, working={stats['working']})")
    else:
        print(f"⚠️ test_get_team_stats_with_running_tasks SKIPPED (no running tasks)")

def test_consistency_running_vs_member_status():
    """팀별 running task와 멤버 상태가 일관성 있는지"""
    from server import DataLoader
    loader = DataLoader(Path('/home/jay/workspace'))
    loader.reload_all(max_age_seconds=0)

    running_by_team = loader.get_running_tasks_by_team()
    teams_info = loader.get_teams_info()

    for team in teams_info:
        team_id = team.get("team_id")
        has_running = bool(running_by_team.get(team_id))

        # sub_teams가 있는 경우 (개발실)
        for sub in team.get("members", []):
            if isinstance(sub, dict) and "sub_team_id" in sub:
                sub_team_id = sub["sub_team_id"]
                sub_has_running = bool(running_by_team.get(sub_team_id))
                lead = sub.get("lead")
                if lead and sub_has_running:
                    assert lead.get("status") == "working", \
                        f"{sub_team_id} 팀장 {lead.get('id')}은 working이어야 함, got: {lead.get('status')}"

    print("✅ test_consistency_running_vs_member_status PASSED")

if __name__ == "__main__":
    tests = [
        test_get_member_status_idle_with_running_task,
        test_get_member_status_idle_without_running_task,
        test_get_member_status_break_preserved,
        test_get_member_status_working_preserved,
        test_get_team_stats_with_running_tasks,
        test_consistency_running_vs_member_status,
    ]

    passed = 0
    failed = 0
    for test in tests:
        try:
            test()
            passed += 1
        except Exception as e:
            print(f"❌ {test.__name__} FAILED: {e}")
            failed += 1

    print(f"\n{'='*50}")
    print(f"결과: {passed} passed, {failed} failed / {len(tests)} total")
    if failed > 0:
        sys.exit(1)
    print("모든 테스트 통과!")
