"""Tests for Picnic Tasks todo platform."""

from unittest.mock import MagicMock, Mock

import pytest
from syrupy.assertion import SnapshotAssertion

from homeassistant.components.todo import ATTR_ITEM, DOMAIN, TodoServices
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError

from .conftest import ENTITY_ID

from tests.common import MockConfigEntry


async def test_cart_list_with_items(
    hass: HomeAssistant,
    init_integration,
    get_items,
    snapshot: SnapshotAssertion,
) -> None:
    """Test loading of shopping cart."""
    state = hass.states.get(ENTITY_ID)
    assert state
    assert state.state == "10"

    assert snapshot == await get_items()


async def test_cart_list_empty_items(
    hass: HomeAssistant, mock_picnic_api: MagicMock, mock_config_entry: MockConfigEntry
) -> None:
    """Test loading of shopping cart without items."""
    mock_picnic_api.get_cart.return_value = {"items": []}
    mock_config_entry.add_to_hass(hass)
    await hass.config_entries.async_setup(mock_config_entry.entry_id)
    await hass.async_block_till_done()

    state = hass.states.get(ENTITY_ID)
    assert state
    assert state.state == "0"


async def test_cart_list_unexpected_response(
    hass: HomeAssistant, mock_picnic_api: MagicMock, mock_config_entry: MockConfigEntry
) -> None:
    """Test loading of shopping cart without expected response."""
    mock_picnic_api.get_cart.return_value = {}
    mock_config_entry.add_to_hass(hass)
    await hass.config_entries.async_setup(mock_config_entry.entry_id)
    await hass.async_block_till_done()

    state = hass.states.get(ENTITY_ID)
    assert state is None


async def test_cart_list_null_response(
    hass: HomeAssistant, mock_picnic_api: MagicMock, mock_config_entry: MockConfigEntry
) -> None:
    """Test loading of shopping cart without response."""
    mock_picnic_api.get_cart.return_value = None
    mock_config_entry.add_to_hass(hass)
    await hass.config_entries.async_setup(mock_config_entry.entry_id)
    await hass.async_block_till_done()

    state = hass.states.get(ENTITY_ID)
    assert state is None


async def test_create_todo_list_item(
    hass: HomeAssistant, init_integration: MockConfigEntry, mock_picnic_api: MagicMock
) -> None:
    """Test for creating a picnic cart item."""
    assert len(mock_picnic_api.get_cart.mock_calls) == 1

    mock_picnic_api.search = Mock()
    mock_picnic_api.search.return_value = [
        {
            "items": [
                {
                    "id": 321,
                    "name": "Picnic Melk",
                    "unit_quantity": "2 liter",
                }
            ]
        }
    ]

    mock_picnic_api.add_product = Mock()

    await hass.services.async_call(
        DOMAIN,
        TodoServices.ADD_ITEM,
        {ATTR_ITEM: "Melk"},
        target={ATTR_ENTITY_ID: ENTITY_ID},
        blocking=True,
    )

    args = mock_picnic_api.search.call_args
    assert args
    assert args[0][0] == "Melk"

    args = mock_picnic_api.add_product.call_args
    assert args
    assert args[0][0] == "321"
    assert args[0][1] == 1

    assert len(mock_picnic_api.get_cart.mock_calls) == 2


async def test_create_todo_list_item_not_found(
    hass: HomeAssistant, init_integration: MockConfigEntry, mock_picnic_api: MagicMock
) -> None:
    """Test for creating a picnic cart item when ID is not found."""
    mock_picnic_api.search = Mock()
    mock_picnic_api.search.return_value = [{"items": []}]

    with pytest.raises(ServiceValidationError):
        await hass.services.async_call(
            DOMAIN,
            TodoServices.ADD_ITEM,
            {ATTR_ITEM: "Melk"},
            target={ATTR_ENTITY_ID: ENTITY_ID},
            blocking=True,
        )