"""The tests for the telegram.notify platform."""

from typing import Any
from unittest.mock import AsyncMock, call, patch

from homeassistant import config as hass_config
from homeassistant.components import notify
from homeassistant.components.notify import ATTR_DATA, ATTR_MESSAGE, ATTR_TITLE
from homeassistant.components.telegram import DOMAIN
from homeassistant.const import SERVICE_RELOAD
from homeassistant.core import HomeAssistant, ServiceRegistry
from homeassistant.helpers import issue_registry as ir
from homeassistant.setup import async_setup_component

from tests.common import get_fixture_path


async def test_reload_notify(
    hass: HomeAssistant, issue_registry: ir.IssueRegistry
) -> None:
    """Verify we can reload the notify service."""

    with patch("homeassistant.components.telegram_bot.async_setup", return_value=True):
        assert await async_setup_component(
            hass,
            notify.DOMAIN,
            {
                notify.DOMAIN: [
                    {
                        "name": DOMAIN,
                        "platform": DOMAIN,
                        "chat_id": 1,
                    },
                ]
            },
        )
        await hass.async_block_till_done()

    assert hass.services.has_service(notify.DOMAIN, DOMAIN)

    yaml_path = get_fixture_path("configuration.yaml", "telegram")
    with patch.object(hass_config, "YAML_CONFIG_FILE", yaml_path):
        await hass.services.async_call(
            DOMAIN,
            SERVICE_RELOAD,
            {},
            blocking=True,
        )
        await hass.async_block_till_done()

    assert not hass.services.has_service(notify.DOMAIN, DOMAIN)
    assert hass.services.has_service(notify.DOMAIN, "telegram_reloaded")

    assert issue_registry.async_get_issue(
        domain=DOMAIN,
        issue_id="migrate_notify",
    )
    assert len(issue_registry.issues) == 1


async def test_notify(hass: HomeAssistant) -> None:
    """Test notify."""

    assert await async_setup_component(
        hass,
        notify.DOMAIN,
        {
            notify.DOMAIN: [
                {
                    "name": DOMAIN,
                    "platform": DOMAIN,
                    "chat_id": 1,
                },
            ]
        },
    )
    await hass.async_block_till_done()

    original_call = ServiceRegistry.async_call
    with patch(
        "homeassistant.core.ServiceRegistry.async_call", new_callable=AsyncMock
    ) as mock_service_call:
        # setup mock

        async def call_service(*args, **kwargs) -> Any:
            if args[0] == notify.DOMAIN:
                return await original_call(
                    hass.services, args[0], args[1], args[2], kwargs["blocking"]
                )
            return AsyncMock()

        mock_service_call.side_effect = call_service

        # test send message

        data: dict[str, Any] = {"title": "mock title", "message": "mock message"}
        await hass.services.async_call(
            notify.DOMAIN,
            DOMAIN,
            {ATTR_TITLE: "mock title", ATTR_MESSAGE: "mock message"},
            blocking=True,
        )
        await hass.async_block_till_done()

        assert mock_service_call.mock_calls == [
            call(
                "notify",
                "telegram",
                data,
                blocking=True,
            ),
            call(
                "telegram_bot",
                "send_message",
                {"chat_id": 1, "title": "mock title", "message": "mock message"},
                False,
                None,
                None,
                False,
            ),
        ]

        mock_service_call.reset_mock()

        # test send file

        data = {
            ATTR_TITLE: "mock title",
            ATTR_MESSAGE: "mock message",
            ATTR_DATA: {
                "photo": {"url": "https://mock/photo.jpg", "caption": "mock caption"}
            },
        }

        await hass.services.async_call(
            notify.DOMAIN,
            DOMAIN,
            data,
            blocking=True,
        )
        await hass.async_block_till_done()

        assert mock_service_call.mock_calls == [
            call(
                "notify",
                "telegram",
                data,
                blocking=True,
            ),
            call(
                "telegram_bot",
                "send_photo",
                {
                    "chat_id": 1,
                    "url": "https://mock/photo.jpg",
                    "caption": "mock caption",
                },
                False,
                None,
                None,
                False,
            ),
        ]
