"""Common fixtures for html5 integration."""

from collections.abc import Generator
from unittest.mock import AsyncMock, MagicMock

from aiohttp import ClientResponse
import pytest

from homeassistant.components.html5.const import (
    ATTR_VAPID_EMAIL,
    ATTR_VAPID_PRV_KEY,
    ATTR_VAPID_PUB_KEY,
    DOMAIN,
)
from homeassistant.const import CONF_NAME

from tests.common import MockConfigEntry, patch

MOCK_CONF = {
    ATTR_VAPID_EMAIL: "test@example.com",
    ATTR_VAPID_PRV_KEY: "h6acSRds8_KR8hT9djD8WucTL06Gfe29XXyZ1KcUjN8",
}
MOCK_CONF_PUB_KEY = (
    "BIUtPN7Rq_8U7RBEqClZrfZ5dR9zPCfvxYPtLpWtRVZTJEc7lzv2dhzDU6Aw1m29"
    "Ao0-UA1Uq6XO9Df8KALBKqA"
)


@pytest.fixture(name="config_entry")
def mock_config_entry() -> MockConfigEntry:
    """Mock ntfy configuration entry."""
    return MockConfigEntry(
        domain=DOMAIN,
        title="HTML5",
        data={
            ATTR_VAPID_PRV_KEY: MOCK_CONF[ATTR_VAPID_PRV_KEY],
            ATTR_VAPID_PUB_KEY: MOCK_CONF_PUB_KEY,
            ATTR_VAPID_EMAIL: MOCK_CONF[ATTR_VAPID_EMAIL],
            CONF_NAME: DOMAIN,
        },
        entry_id="ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    )


@pytest.fixture(name="load_config")
def mock_load_config() -> Generator[MagicMock]:
    """Mock load config."""

    with patch(
        "homeassistant.components.html5.notify._load_config", return_value={}
    ) as mock_load_config:
        yield mock_load_config


@pytest.fixture
def mock_wp() -> Generator[AsyncMock]:
    """Mock WebPusher."""

    with patch(
        "homeassistant.components.html5.notify.WebPusher", autospec=True
    ) as mock_client:
        client = mock_client.return_value
        client.cls = mock_client
        client.send_async.return_value = AsyncMock(spec=ClientResponse, status=201)
        yield client


@pytest.fixture(name="webpush_async")
def mock_webpush_async() -> Generator[AsyncMock]:
    """Mock webpush_async."""

    with patch(
        "homeassistant.components.html5.notify.webpush_async", autospec=True
    ) as mock_client:
        mock_client.return_value = AsyncMock(spec=ClientResponse, status=201)
        yield mock_client


@pytest.fixture
def mock_jwt() -> Generator[MagicMock]:
    """Mock JWT."""

    with (
        patch("homeassistant.components.html5.notify.jwt") as mock_client,
    ):
        mock_client.encode.return_value = "JWT"
        mock_client.decode.return_value = {"target": "device"}
        yield mock_client


@pytest.fixture
def mock_uuid() -> Generator[MagicMock]:
    """Mock UUID."""

    with (
        patch("homeassistant.components.html5.notify.uuid") as mock_client,
    ):
        mock_client.uuid4.return_value = "12345678-1234-5678-1234-567812345678"
        yield mock_client


@pytest.fixture
def mock_vapid() -> Generator[MagicMock]:
    """Mock VAPID headers."""

    with (
        patch(
            "homeassistant.components.html5.notify.Vapid", autospec=True
        ) as mock_client,
    ):
        mock_client.from_string.return_value.sign.return_value = {
            "Authorization": "vapid t=signed!!!",
            "urgency": "normal",
            "priority": "normal",
        }
        yield mock_client
