"""The serive tests for the tado platform."""

import json
from unittest.mock import patch

import pytest
from requests.exceptions import RequestException

from homeassistant.components.tado.const import (
    CONF_CONFIG_ENTRY,
    CONF_READING,
    DOMAIN,
    SERVICE_ADD_METER_READING,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError

from .util import async_init_integration

from tests.common import MockConfigEntry, load_fixture


async def test_has_services(
    hass: HomeAssistant,
) -> None:
    """Test the existence of the Tado Service."""

    await async_init_integration(hass)

    assert hass.services.has_service(DOMAIN, SERVICE_ADD_METER_READING)


async def test_add_meter_readings(
    hass: HomeAssistant,
) -> None:
    """Test the add_meter_readings service."""

    await async_init_integration(hass)

    config_entry: MockConfigEntry = hass.config_entries.async_entries(DOMAIN)[0]
    fixture: str = load_fixture("tado/add_readings_success.json")
    with patch(
        "PyTado.interface.Tado.set_eiq_meter_readings",
        return_value=json.loads(fixture),
    ):
        response: None = await hass.services.async_call(
            DOMAIN,
            SERVICE_ADD_METER_READING,
            service_data={
                CONF_CONFIG_ENTRY: config_entry.entry_id,
                CONF_READING: 1234,
            },
            blocking=True,
        )
        assert response is None


async def test_add_meter_readings_exception(
    hass: HomeAssistant,
) -> None:
    """Test the add_meter_readings service with a RequestException."""

    await async_init_integration(hass)

    config_entry: MockConfigEntry = hass.config_entries.async_entries(DOMAIN)[0]
    with (
        patch(
            "PyTado.interface.Tado.set_eiq_meter_readings",
            side_effect=RequestException("Error"),
        ),
        pytest.raises(HomeAssistantError) as exc,
    ):
        await hass.services.async_call(
            DOMAIN,
            SERVICE_ADD_METER_READING,
            service_data={
                CONF_CONFIG_ENTRY: config_entry.entry_id,
                CONF_READING: 1234,
            },
            blocking=True,
        )

    assert "Could not set meter reading" in str(exc)


async def test_add_meter_readings_invalid(
    hass: HomeAssistant,
) -> None:
    """Test the add_meter_readings service with an invalid_meter_reading response."""

    await async_init_integration(hass)

    config_entry: MockConfigEntry = hass.config_entries.async_entries(DOMAIN)[0]
    fixture: str = load_fixture("tado/add_readings_invalid_meter_reading.json")
    with (
        patch(
            "PyTado.interface.Tado.set_eiq_meter_readings",
            return_value=json.loads(fixture),
        ),
        pytest.raises(HomeAssistantError) as exc,
    ):
        await hass.services.async_call(
            DOMAIN,
            SERVICE_ADD_METER_READING,
            service_data={
                CONF_CONFIG_ENTRY: config_entry.entry_id,
                CONF_READING: 1234,
            },
            blocking=True,
        )

    assert "invalid new reading" in str(exc)


async def test_add_meter_readings_duplicate(
    hass: HomeAssistant,
) -> None:
    """Test the add_meter_readings service with a duplicated_meter_reading response."""

    await async_init_integration(hass)

    config_entry: MockConfigEntry = hass.config_entries.async_entries(DOMAIN)[0]
    fixture: str = load_fixture("tado/add_readings_duplicated_meter_reading.json")
    with (
        patch(
            "PyTado.interface.Tado.set_eiq_meter_readings",
            return_value=json.loads(fixture),
        ),
        pytest.raises(HomeAssistantError) as exc,
    ):
        await hass.services.async_call(
            DOMAIN,
            SERVICE_ADD_METER_READING,
            service_data={
                CONF_CONFIG_ENTRY: config_entry.entry_id,
                CONF_READING: 1234,
            },
            blocking=True,
        )

    assert "reading already exists for date" in str(exc)