"""Offline alert Telegram channel routing."""

from unittest.mock import AsyncMock, patch

import pytest

from server.infrastructure.telegram import resolve_offline_telegram_credentials, send_telegram_offline_alert


def test_resolve_offline_credentials_prefers_dedicated(monkeypatch):
    from server.config import settings

    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_BOT_TOKEN", "off-token")
    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_CHAT_ID", "off-chat")
    monkeypatch.setattr(settings, "TELEGRAM_BOT_TOKEN", "main-token")
    monkeypatch.setattr(settings, "TELEGRAM_CHAT_ID", "main-chat")

    assert resolve_offline_telegram_credentials() == ("off-token", "off-chat")


def test_resolve_offline_credentials_falls_back_to_main(monkeypatch):
    from server.config import settings

    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_BOT_TOKEN", "")
    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_CHAT_ID", "")
    monkeypatch.setattr(settings, "TELEGRAM_BOT_TOKEN", "main-token")
    monkeypatch.setattr(settings, "TELEGRAM_CHAT_ID", "main-chat")

    assert resolve_offline_telegram_credentials() == ("main-token", "main-chat")


def test_resolve_offline_credentials_partial_offline_uses_main(monkeypatch):
    from server.config import settings

    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_BOT_TOKEN", "off-only")
    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_CHAT_ID", "")
    monkeypatch.setattr(settings, "TELEGRAM_BOT_TOKEN", "main-token")
    monkeypatch.setattr(settings, "TELEGRAM_CHAT_ID", "main-chat")

    assert resolve_offline_telegram_credentials() == ("main-token", "main-chat")


@pytest.mark.asyncio
async def test_send_offline_alert_uses_dedicated_bot(monkeypatch):
    from server.config import settings

    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_BOT_TOKEN", "off-token")
    monkeypatch.setattr(settings, "TELEGRAM_OFFLINE_CHAT_ID", "off-chat")
    monkeypatch.setattr(settings, "NOTIFY_ALERT_OFFLINE", "true")

    with patch(
        "server.infrastructure.telegram.send_telegram",
        new_callable=AsyncMock,
        return_value=True,
    ) as mock_send:
        ok = await send_telegram_offline_alert("srv-1", server_id=9)

    assert ok is True
    mock_send.assert_awaited_once()
    _, kwargs = mock_send.call_args
    assert kwargs["bot_token"] == "off-token"
    assert kwargs["chat_id"] == "off-chat"
