#!/usr/bin/env python3
"""utils/bot_activity.py 테스트 스위트"""

import json
import sys
import tempfile
from pathlib import Path
from unittest.mock import patch

import pytest

# workspace 루트를 path에 추가
sys.path.insert(0, str(Path(__file__).parent.parent.parent))

from utils.bot_activity import TEAM_TO_BOT, get_bot_status, set_bot_status


class TestSetBotStatus:
    """set_bot_status() 테스트"""

    def test_set_bot_status_processing(self, tmp_path):
        """status를 processing으로 설정"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text(
            json.dumps(
                {
                    "bots": {
                        "dev1": {"status": "idle", "since": "2026-03-01T00:00:00Z"},
                    }
                }
            )
        )

        # 경로 재설정
        ba.BOT_ACTIVITY_FILE = bot_activity_file
        ba.set_bot_status("dev1-team", "processing")

        # 파일에서 다시 읽어서 확인
        data = json.loads(bot_activity_file.read_text())
        assert data["bots"]["dev1"]["status"] == "processing"
        # since가 현재 시간으로 갱신되었는지 확인 (2026-03로 시작해야 함)
        assert data["bots"]["dev1"]["since"].startswith("2026-03")

    def test_set_bot_status_idle(self, tmp_path):
        """status를 idle로 설정"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text(
            json.dumps(
                {
                    "bots": {
                        "dev2": {"status": "processing", "since": "2026-03-01T00:00:00Z"},
                    }
                }
            )
        )

        ba.BOT_ACTIVITY_FILE = bot_activity_file
        ba.set_bot_status("dev2-team", "idle")

        data = json.loads(bot_activity_file.read_text())
        assert data["bots"]["dev2"]["status"] == "idle"
        assert data["bots"]["dev2"]["since"].startswith("2026-03")

    def test_set_bot_status_creates_file(self, tmp_path):
        """파일이 없으면 생성"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        ba.BOT_ACTIVITY_FILE = bot_activity_file

        ba.set_bot_status("dev3-team", "processing")

        assert bot_activity_file.exists()
        data = json.loads(bot_activity_file.read_text())
        assert data["bots"]["dev3"]["status"] == "processing"

    def test_set_bot_status_unknown_team(self, tmp_path):
        """알 수 없는 팀은 무시"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        original_content = {"bots": {"dev1": {"status": "idle", "since": "2026-03-01T00:00:00Z"}}}
        bot_activity_file.write_text(json.dumps(original_content))

        ba.BOT_ACTIVITY_FILE = bot_activity_file
        ba.set_bot_status("unknown-team", "processing")

        # 파일 내용이 변경되지 않아야 함
        data = json.loads(bot_activity_file.read_text())
        assert data == original_content

    def test_set_bot_status_handles_exception(self, tmp_path):
        """예외 발생 시 무시 (파일 손상 등)"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text("invalid json {")

        ba.BOT_ACTIVITY_FILE = bot_activity_file

        # 예외 없이 실행되어야 함
        ba.set_bot_status("dev1-team", "processing")


class TestGetBotStatus:
    """get_bot_status() 테스트"""

    def test_get_bot_status_exists(self, tmp_path):
        """봇 상태 조회 성공"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text(
            json.dumps(
                {
                    "bots": {
                        "dev1": {"status": "processing", "since": "2026-03-17T00:00:00Z"},
                    }
                }
            )
        )

        ba.BOT_ACTIVITY_FILE = bot_activity_file
        result = ba.get_bot_status("dev1-team")

        assert result is not None
        assert result["status"] == "processing"

    def test_get_bot_status_not_exists(self, tmp_path):
        """봇이 없으면 None 반환"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text(json.dumps({"bots": {}}))

        ba.BOT_ACTIVITY_FILE = bot_activity_file
        result = ba.get_bot_status("dev1-team")

        assert result is None

    def test_get_bot_status_file_not_exists(self, tmp_path):
        """파일이 없으면 None 반환"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "nonexistent.json"
        ba.BOT_ACTIVITY_FILE = bot_activity_file

        result = ba.get_bot_status("dev1-team")
        assert result is None

    def test_get_bot_status_handles_exception(self, tmp_path):
        """예외 발생 시 None 반환"""
        import utils.bot_activity as ba

        bot_activity_file = tmp_path / "memory" / "events" / "bot-activity.json"
        bot_activity_file.parent.mkdir(parents=True)
        bot_activity_file.write_text("invalid json {")

        ba.BOT_ACTIVITY_FILE = bot_activity_file
        result = ba.get_bot_status("dev1-team")

        assert result is None


class TestTeamToBotMapping:
    """TEAM_TO_BOT 매핑 테스트"""

    def test_dev1_team_maps_to_dev1(self):
        """dev1-team → dev1"""
        assert TEAM_TO_BOT["dev1-team"] == "dev1"

    def test_dev2_team_maps_to_dev2(self):
        """dev2-team → dev2"""
        assert TEAM_TO_BOT["dev2-team"] == "dev2"

    def test_dev3_team_maps_to_dev3(self):
        """dev3-team → dev3"""
        assert TEAM_TO_BOT["dev3-team"] == "dev3"

    def test_dev4_team_maps_to_dev4(self):
        """dev4-team → dev4"""
        assert TEAM_TO_BOT["dev4-team"] == "dev4"

    def test_dev5_team_maps_to_dev5(self):
        """dev5-team → dev5"""
        assert TEAM_TO_BOT["dev5-team"] == "dev5"

    def test_dev6_team_maps_to_dev6(self):
        """dev6-team → dev6"""
        assert TEAM_TO_BOT["dev6-team"] == "dev6"

    def test_dev7_team_maps_to_dev7(self):
        """dev7-team → dev7"""
        assert TEAM_TO_BOT["dev7-team"] == "dev7"

    def test_dev8_team_maps_to_dev8(self):
        """dev8-team → dev8"""
        assert TEAM_TO_BOT["dev8-team"] == "dev8"


if __name__ == "__main__":
    pytest.main([__file__, "-v"])
