"""task-2054: finish-task.sh의 member-status idle 복원 로직 테스트"""
import json
import subprocess
from pathlib import Path

import pytest


WORKSPACE = Path("/home/jay/workspace")
STATUS_FILE = WORKSPACE / "memory" / "events" / "member-status.json"


@pytest.fixture
def backup_status():
    """member-status.json 백업 및 복원"""
    backup = STATUS_FILE.read_text()
    yield
    STATUS_FILE.write_text(backup)


@pytest.mark.usefixtures("backup_status")
class TestMemberIdleRestore:
    """finish-task.sh의 idle 복원 로직 단위 테스트"""

    def test_working_member_restored_to_idle(self):
        """working 상태 멤버가 idle로 복원된다"""
        data = json.loads(STATUS_FILE.read_text())
        data["members"]["thor"] = {
            "status": "working",
            "since": "2026-04-21T00:00:00Z",
            "task": "task-2054-test: 테스트 작업",
        }
        STATUS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False))

        # finish-task.sh에서 추출한 idle 복원 로직 실행
        result = subprocess.run(
            [
                "python3", "-c",
                """
import json
from datetime import datetime, timezone
status_file = '%s'
try:
    with open(status_file) as f:
        data = json.load(f)
    now = datetime.now(timezone.utc).strftime('%%Y-%%m-%%dT%%H:%%M:%%SZ')
    changed = False
    for name, info in data.get('members', {}).items():
        if info.get('status') == 'working':
            task_desc = info.get('task', '') or ''
            if 'task-2054-test' in task_desc or not task_desc:
                info['status'] = 'idle'
                info['since'] = now
                info['task'] = None
                changed = True
    if changed:
        data['updated_at'] = now
        with open(status_file, 'w') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
except Exception as e:
    pass
""" % str(STATUS_FILE),
            ],
            capture_output=True,
            text=True,
        )
        assert result.returncode == 0

        restored = json.loads(STATUS_FILE.read_text())
        assert restored["members"]["thor"]["status"] == "idle"
        assert restored["members"]["thor"]["task"] is None

    def test_empty_task_working_member_restored(self):
        """task가 빈 문자열인 working 멤버도 idle로 복원된다"""
        data = json.loads(STATUS_FILE.read_text())
        data["members"]["freya"] = {
            "status": "working",
            "since": "2026-04-21T00:00:00Z",
            "task": "",
        }
        STATUS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False))

        result = subprocess.run(
            [
                "python3", "-c",
                """
import json
from datetime import datetime, timezone
status_file = '%s'
try:
    with open(status_file) as f:
        data = json.load(f)
    now = datetime.now(timezone.utc).strftime('%%Y-%%m-%%dT%%H:%%M:%%SZ')
    changed = False
    for name, info in data.get('members', {}).items():
        if info.get('status') == 'working':
            task_desc = info.get('task', '') or ''
            if 'task-2054-test' in task_desc or not task_desc:
                info['status'] = 'idle'
                info['since'] = now
                info['task'] = None
                changed = True
    if changed:
        data['updated_at'] = now
        with open(status_file, 'w') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
except Exception as e:
    pass
""" % str(STATUS_FILE),
            ],
            capture_output=True,
            text=True,
        )
        assert result.returncode == 0

        restored = json.loads(STATUS_FILE.read_text())
        assert restored["members"]["freya"]["status"] == "idle"
        assert restored["members"]["freya"]["task"] is None

    def test_idle_member_unchanged(self):
        """이미 idle인 멤버는 변경되지 않는다"""
        data = json.loads(STATUS_FILE.read_text())
        original_since = data["members"].get("odin", {}).get("since", "2026-04-17T01:10:58Z")

        result = subprocess.run(
            [
                "python3", "-c",
                """
import json
from datetime import datetime, timezone
status_file = '%s'
try:
    with open(status_file) as f:
        data = json.load(f)
    now = datetime.now(timezone.utc).strftime('%%Y-%%m-%%dT%%H:%%M:%%SZ')
    changed = False
    for name, info in data.get('members', {}).items():
        if info.get('status') == 'working':
            task_desc = info.get('task', '') or ''
            if 'task-2054-test' in task_desc or not task_desc:
                info['status'] = 'idle'
                info['since'] = now
                info['task'] = None
                changed = True
    if changed:
        data['updated_at'] = now
        with open(status_file, 'w') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
except Exception as e:
    pass
""" % str(STATUS_FILE),
            ],
            capture_output=True,
            text=True,
        )
        assert result.returncode == 0

        restored = json.loads(STATUS_FILE.read_text())
        assert restored["members"]["odin"]["status"] == "idle"
        assert restored["members"]["odin"]["since"] == original_since
