"""Regression coverage for the shared Telegram collection mock."""

import sys
from types import ModuleType, SimpleNamespace

import pytest

from tests.gateway.conftest import _ensure_telegram_mock


_MISSING = object()


def _preloaded_telegram_tree(
    chat_type: object,
) -> tuple[ModuleType, ModuleType, dict[str, ModuleType]]:
    """Build a package-like cached Telegram tree without importing Telegram."""
    telegram = ModuleType("telegram")
    telegram.__path__ = []
    constants = ModuleType("telegram.constants")
    if chat_type is not _MISSING:
        setattr(constants, "ChatType", chat_type)
    modules = {
        "telegram": telegram,
        "telegram.constants": constants,
        "telegram.error": ModuleType("telegram.error"),
        "telegram.ext": ModuleType("telegram.ext"),
        "telegram.request": ModuleType("telegram.request"),
    }
    for name, module in modules.items():
        if name != "telegram":
            setattr(telegram, name.rsplit(".", 1)[1], module)
    return telegram, constants, modules


@pytest.mark.parametrize(
    ("chat_type", "expect_replacement"),
    [
        (None, True),
        (_MISSING, True),
        (SimpleNamespace(GROUP="existing"), False),
    ],
    ids=("none", "missing", "valid_fake"),
)
def test_ensure_telegram_mock_replaces_only_invalid_preloaded_package_tree(
    monkeypatch, chat_type, expect_replacement
):
    """Missing ChatType must not let a cached package bypass the shared mock."""
    telegram, constants, modules = _preloaded_telegram_tree(chat_type)
    for name, module in modules.items():
        monkeypatch.setitem(sys.modules, name, module)

    _ensure_telegram_mock()

    if expect_replacement:
        assert sys.modules["telegram"] is not telegram
        assert sys.modules["telegram.constants"].constants.ChatType.GROUP == "group"
    else:
        assert sys.modules["telegram"] is telegram
        assert sys.modules["telegram.constants"] is constants
        assert sys.modules["telegram.constants"].ChatType.GROUP == "existing"
