"""Tests for the lastfm sensor."""
from unittest.mock import patch

from pylast import Track
import pytest

from homeassistant.components import sensor
from homeassistant.components.lastfm.sensor import STATE_NOT_SCROBBLING
from homeassistant.setup import async_setup_component


class MockNetwork:
    """Mock _Network object for pylast."""

    def __init__(self, username: str):
        """Initialize the mock."""
        self.username = username


class MockUser:
    """Mock User object for pylast."""

    def __init__(self, now_playing_result):
        """Initialize the mock."""
        self._now_playing_result = now_playing_result

    def get_playcount(self):
        """Get mock play count."""
        return 1

    def get_image(self):
        """Get mock image."""
        pass

    def get_recent_tracks(self, limit):
        """Get mock recent tracks."""
        return []

    def get_top_tracks(self, limit):
        """Get mock top tracks."""
        return []

    def get_now_playing(self):
        """Get mock now playing."""
        return self._now_playing_result


@pytest.fixture(name="lastfm_network")
def lastfm_network_fixture():
    """Create fixture for LastFMNetwork."""
    with patch("pylast.LastFMNetwork") as lastfm_network:
        yield lastfm_network


async def test_update_not_playing(hass, lastfm_network):
    """Test update when no playing song."""

    lastfm_network.return_value.get_user.return_value = MockUser(None)

    assert await async_setup_component(
        hass,
        sensor.DOMAIN,
        {"sensor": {"platform": "lastfm", "api_key": "secret-key", "users": ["test"]}},
    )
    await hass.async_block_till_done()

    entity_id = "sensor.test"

    state = hass.states.get(entity_id)

    assert state.state == STATE_NOT_SCROBBLING


async def test_update_playing(hass, lastfm_network):
    """Test update when song playing."""

    lastfm_network.return_value.get_user.return_value = MockUser(
        Track("artist", "title", MockNetwork("test"))
    )

    assert await async_setup_component(
        hass,
        sensor.DOMAIN,
        {"sensor": {"platform": "lastfm", "api_key": "secret-key", "users": ["test"]}},
    )
    await hass.async_block_till_done()

    entity_id = "sensor.test"

    state = hass.states.get(entity_id)

    assert state.state == "artist - title"