"""Signal notification test helpers."""
from http import HTTPStatus

from pysignalclirestapi import SignalCliRestApi
import pytest
from requests_mock.mocker import Mocker

from homeassistant.components.signal_messenger.notify import SignalNotificationService
from homeassistant.core import HomeAssistant

SIGNAL_SEND_PATH_SUFIX = "/v2/send"
MESSAGE = "Testing Signal Messenger platform :)"
CONTENT = b"TestContent"
NUMBER_FROM = "+43443434343"
NUMBERS_TO = ["+435565656565"]
URL_ATTACHMENT = "http://127.0.0.1:8080/image.jpg"


@pytest.fixture
def signal_notification_service(hass: HomeAssistant) -> SignalNotificationService:
    """Set up signal notification service."""
    hass.config.allowlist_external_urls.add(URL_ATTACHMENT)
    recipients = ["+435565656565"]
    number = "+43443434343"
    client = SignalCliRestApi("http://127.0.0.1:8080", number)
    return SignalNotificationService(hass, recipients, client)


@pytest.fixture
def signal_requests_mock_factory(requests_mock: Mocker) -> Mocker:
    """Create signal service mock from factory."""

    def _signal_requests_mock_factory(
        success_send_result: bool = True, content_length_header: str = None
    ) -> Mocker:
        requests_mock.register_uri(
            "GET",
            "http://127.0.0.1:8080/v1/about",
            status_code=HTTPStatus.OK,
            json={"versions": ["v1", "v2"]},
        )
        if success_send_result:
            requests_mock.register_uri(
                "POST",
                "http://127.0.0.1:8080" + SIGNAL_SEND_PATH_SUFIX,
                status_code=HTTPStatus.CREATED,
            )
        else:
            requests_mock.register_uri(
                "POST",
                "http://127.0.0.1:8080" + SIGNAL_SEND_PATH_SUFIX,
                status_code=HTTPStatus.BAD_REQUEST,
            )
        if content_length_header is not None:
            requests_mock.register_uri(
                "GET",
                URL_ATTACHMENT,
                status_code=HTTPStatus.OK,
                content=CONTENT,
                headers={"Content-Length": content_length_header},
            )
        else:
            requests_mock.register_uri(
                "GET",
                URL_ATTACHMENT,
                status_code=HTTPStatus.OK,
                content=CONTENT,
            )
        return requests_mock

    return _signal_requests_mock_factory