"""finish-task.sh의 member-status.json 복원 로직 테스트.

finish-task.sh 내부 인라인 Python 로직을 함수로 추출하여 테스트.
"""
from datetime import datetime, timezone


def restore_member_status(data: dict, task_id: str) -> dict:
    """finish-task.sh L277~304 인라인 Python 로직 추출."""
    now = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
    changed = False
    for _, info in data.get('members', {}).items():
        if info.get('status') in ('working', 'standby'):
            task_desc = info.get('task', '') or ''
            if task_id in task_desc or not task_desc or info.get('status') == 'standby':
                info['status'] = 'idle'
                info['since'] = now
                info['task'] = None
                changed = True
    if changed:
        data['updated_at'] = now
    return data


class TestMemberStatusRestore:
    def test_standby_members_restored_to_idle(self):
        """시나리오 1: standby 팀원 → idle 복원."""
        data = {
            'members': {
                'member-1': {'status': 'standby', 'since': '2026-01-01T00:00:00Z', 'task': None},
                'member-2': {'status': 'standby', 'since': '2026-01-01T00:00:00Z', 'task': 'some-info'},
            }
        }
        result = restore_member_status(data, 'test-task')
        assert result['members']['member-1']['status'] == 'idle'
        assert result['members']['member-2']['status'] == 'idle'
        assert result['members']['member-1']['task'] is None
        assert result['members']['member-2']['task'] is None

    def test_working_member_with_matching_task_restored(self):
        """시나리오 2: working + 매칭 task → idle 복원."""
        data = {
            'members': {
                'worker': {'status': 'working', 'since': '2026-01-01T00:00:00Z', 'task': 'task-123'},
            }
        }
        result = restore_member_status(data, 'task-123')
        assert result['members']['worker']['status'] == 'idle'

    def test_working_member_with_non_matching_task_preserved(self):
        """시나리오 3: working + 다른 task → 유지."""
        data = {
            'members': {
                'other': {'status': 'working', 'since': '2026-01-01T00:00:00Z', 'task': 'OTHER-TASK'},
            }
        }
        result = restore_member_status(data, 'test-task')
        assert result['members']['other']['status'] == 'working'
        assert result['members']['other']['task'] == 'OTHER-TASK'

    def test_idle_member_not_affected(self):
        """idle 팀원은 영향 없음."""
        data = {
            'members': {
                'idler': {'status': 'idle', 'since': '2026-01-01T00:00:00Z', 'task': None},
            }
        }
        result = restore_member_status(data, 'test-task')
        assert result['members']['idler']['status'] == 'idle'
        assert 'updated_at' not in result  # changed=False

    def test_working_member_with_empty_task_restored(self):
        """working + 빈 task → idle 복원."""
        data = {
            'members': {
                'worker': {'status': 'working', 'since': '2026-01-01T00:00:00Z', 'task': ''},
            }
        }
        result = restore_member_status(data, 'test-task')
        assert result['members']['worker']['status'] == 'idle'

    def test_mixed_statuses(self):
        """혼합 상태: standby + working(매칭) + working(비매칭) + idle."""
        data = {
            'members': {
                'standby-m': {'status': 'standby', 'since': '2026-01-01T00:00:00Z', 'task': None},
                'working-match': {'status': 'working', 'since': '2026-01-01T00:00:00Z', 'task': 'task-abc'},
                'working-other': {'status': 'working', 'since': '2026-01-01T00:00:00Z', 'task': 'OTHER'},
                'idle-m': {'status': 'idle', 'since': '2026-01-01T00:00:00Z', 'task': None},
            }
        }
        result = restore_member_status(data, 'task-abc')
        assert result['members']['standby-m']['status'] == 'idle'
        assert result['members']['working-match']['status'] == 'idle'
        assert result['members']['working-other']['status'] == 'working'
        assert result['members']['idle-m']['status'] == 'idle'
