"""tests/ 공통 fixture.

task-448.1: team_prompts.py 모듈레벨 크래시 제거 후,
ANU_KEY가 없는 테스트 환경에서도 build_prompt()가 정상 동작하도록
모듈 변수를 테스트용 값으로 패치한다.

task-448.2: CI/CD 등 .env.keys 파일이 없는 환경에서 발생하는
환경변수 의존성을 제거하기 위해 모든 관련 환경변수를 더미 값으로 세팅한다.
"""

import os
import sys
from pathlib import Path

import pytest
import requests as _requests_preload  # noqa: F401  # 조기 로드로 test_group_chat.py stub 방지

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

TEST_CHAT_ID = os.environ.get("COKACDIR_CHAT_ID", "6937032012")


@pytest.fixture(autouse=True)
def _set_test_env_keys(monkeypatch):
    """모든 테스트에서 환경변수 의존성을 제거하기 위해 더미 값을 세팅한다.

    1. 환경변수(os.environ)에 더미 키/토큰 값을 주입하여
       .env.keys 파일이 없는 CI/CD 환경에서도 테스트가 통과하도록 한다.
    2. 이미 임포트된 team_prompts 모듈의 ANU_KEY 변수도 직접 패치하여
       모듈 로드 시점의 캐싱 문제를 함께 해결한다.
    """
    # 환경변수 더미 세팅 (os.environ 레벨)
    monkeypatch.setenv("COKACDIR_KEY_ANU", "test-key-anu")
    monkeypatch.setenv("COKACDIR_KEY_DEV1", "test-key-dev1")
    monkeypatch.setenv("COKACDIR_KEY_DEV2", "test-key-dev2")
    monkeypatch.setenv("COKACDIR_KEY_DEV3", "test-key-dev3")
    monkeypatch.setenv("COKACDIR_KEY_DEV4", "test-key-dev4")
    monkeypatch.setenv("COKACDIR_KEY_DEV5", "test-key-dev5")
    monkeypatch.setenv("COKACDIR_KEY_DEV6", "test-key-dev6")
    monkeypatch.setenv("COKACDIR_KEY_DEV7", "test-key-dev7")
    monkeypatch.setenv("COKACDIR_KEY_DEV8", "test-key-dev8")
    monkeypatch.setenv("ANU_BOT_TOKEN", "test-bot-token")
    monkeypatch.setenv("COKACDIR_CHAT_ID", "0000000000")

    # 이미 임포트된 모듈의 모듈 변수 패치 (모듈 캐싱 대응)
    try:
        import prompts.team_prompts as tp

        monkeypatch.setattr(tp, "ANU_KEY", "test-anu-key")
    except ImportError:
        pass


@pytest.fixture(autouse=True)
def _restore_dispatch_module():
    """각 테스트 후 sys.modules["dispatch"]를 복원하여 모듈 재로딩에 의한 테스트 간 오염을 방지한다.

    일부 테스트가 dispatch 모듈을 sys.modules에서 제거하고 재임포트할 때,
    새 모듈 객체가 sys.modules에 남아 다른 테스트의 함수 __globals__ 참조와
    불일치가 발생하는 문제를 방지한다.
    """
    original_dispatch = sys.modules.get("dispatch")
    yield
    if original_dispatch is not None:
        sys.modules["dispatch"] = original_dispatch
    elif "dispatch" in sys.modules:
        # 테스트 전에 없었으면 제거
        del sys.modules["dispatch"]


@pytest.fixture(autouse=True)  # noqa: F811
def _restore_verifier_modules():  # noqa: F811
    """각 테스트 후 verifiers 서브모듈을 복원하여 MagicMock 오염을 방지한다.

    test_qc_gate.py가 모듈 레벨에서 verifiers.test_runner 등을 MagicMock으로
    교체하는데, 이를 복원하지 않으면 이후 테스트에서 실제 verifier 대신
    MagicMock을 호출하게 된다.
    """
    import unittest.mock

    _verifier_names = [
        "verifiers", "verifiers.api_health", "verifiers.data_integrity",
        "verifiers.file_check", "verifiers.pyright_check",
        "verifiers.schema_contract", "verifiers.scope_check",
        "verifiers.style_check", "verifiers.tdd_check", "verifiers.test_runner",
    ]
    originals = {}
    for name in _verifier_names:
        if name in sys.modules:
            originals[name] = sys.modules[name]
    yield
    for name in _verifier_names:
        current = sys.modules.get(name)
        if isinstance(current, unittest.mock.MagicMock):
            if name in originals and not isinstance(originals[name], unittest.mock.MagicMock):
                sys.modules[name] = originals[name]
            elif name in sys.modules:
                del sys.modules[name]
