from __future__ import annotations

import importlib
from types import SimpleNamespace
from unittest.mock import AsyncMock

import pytest


@pytest.fixture(autouse=True)
def fresh_db(tmp_path, monkeypatch):
    monkeypatch.setenv("DB_PATH", str(tmp_path / "test.db"))
    import adapter.telegram.db as db_mod
    importlib.reload(db_mod)
    db_mod.init_db()
    return db_mod


BOT_ID = 9999  # distinct from any test user_id


def make_service_message(*, user_id=1, thread_id=42, topic_name="Мой чат"):
    m = SimpleNamespace()
    m.message_thread_id = thread_id
    m.from_user = SimpleNamespace(id=user_id, full_name="Alice")
    m.chat = SimpleNamespace(id=user_id)
    m.forum_topic_created = SimpleNamespace(name=topic_name)
    m.forum_topic_edited = SimpleNamespace(name="Новое имя")
    m.forum_topic_closed = SimpleNamespace()
    m.answer = AsyncMock()
    m.bot = SimpleNamespace(id=BOT_ID)
    return m


async def test_on_topic_created_registers_chat(fresh_db, monkeypatch):
    import adapter.telegram.handlers.topic_events as mod
    importlib.reload(mod)
    msg = make_service_message(user_id=5, thread_id=99, topic_name="Мой чат")
    await mod.on_topic_created(msg)
    chat = fresh_db.get_chat(5, 99)
    assert chat is not None
    assert chat["chat_name"] == "Мой чат"


async def test_on_topic_edited_renames_chat(fresh_db, monkeypatch):
    import adapter.telegram.handlers.topic_events as mod
    importlib.reload(mod)
    fresh_db.create_chat(5, 99, "Старое имя")
    msg = make_service_message(user_id=5, thread_id=99)
    await mod.on_topic_edited(msg)
    assert fresh_db.get_chat(5, 99)["chat_name"] == "Новое имя"


async def test_on_topic_edited_unknown_chat_is_noop(fresh_db):
    import adapter.telegram.handlers.topic_events as mod
    importlib.reload(mod)
    msg = make_service_message(user_id=5, thread_id=999)
    await mod.on_topic_edited(msg)  # should not raise


async def test_on_topic_closed_archives_chat(fresh_db):
    import adapter.telegram.handlers.topic_events as mod
    importlib.reload(mod)
    fresh_db.create_chat(5, 99, "Чат #1")
    msg = make_service_message(user_id=5, thread_id=99)
    await mod.on_topic_closed(msg)
    assert fresh_db.get_chat(5, 99)["archived_at"] is not None


async def test_on_topic_closed_unknown_chat_is_noop(fresh_db):
    import adapter.telegram.handlers.topic_events as mod
    importlib.reload(mod)
    msg = make_service_message(user_id=5, thread_id=999)
    await mod.on_topic_closed(msg)  # should not raise
