"""The tests for the Yamaha Media player platform."""
import unittest
from unittest.mock import patch, MagicMock

from homeassistant.setup import setup_component
import homeassistant.components.media_player as mp
from homeassistant.components.yamaha import media_player as yamaha
from tests.common import get_test_home_assistant


def _create_zone_mock(name, url):
    zone = MagicMock()
    zone.ctrl_url = url
    zone.zone = name
    return zone


class FakeYamahaDevice:
    """A fake Yamaha device."""

    def __init__(self, ctrl_url, name, zones=None):
        """Initialize the fake Yamaha device."""
        self.ctrl_url = ctrl_url
        self.name = name
        self.zones = zones or []

    def zone_controllers(self):
        """Return controllers for all available zones."""
        return self.zones


class TestYamahaMediaPlayer(unittest.TestCase):
    """Test the Yamaha media player."""

    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        self.main_zone = _create_zone_mock("Main zone", "http://main")
        self.device = FakeYamahaDevice(
            "http://receiver", "Receiver", zones=[self.main_zone]
        )

    def tearDown(self):
        """Stop everything that was started."""
        self.hass.stop()

    def enable_output(self, port, enabled):
        """Enable output on a specific port."""
        data = {
            "entity_id": "media_player.yamaha_receiver_main_zone",
            "port": port,
            "enabled": enabled,
        }

        self.hass.services.call(yamaha.DOMAIN, yamaha.SERVICE_ENABLE_OUTPUT, data, True)

    def create_receiver(self, mock_rxv):
        """Create a mocked receiver."""
        mock_rxv.return_value = self.device

        config = {"media_player": {"platform": "yamaha", "host": "127.0.0.1"}}

        assert setup_component(self.hass, mp.DOMAIN, config)

    @patch("rxv.RXV")
    def test_enable_output(self, mock_rxv):
        """Test enabling and disabling outputs."""
        self.create_receiver(mock_rxv)

        self.enable_output("hdmi1", True)
        self.main_zone.enable_output.assert_called_with("hdmi1", True)

        self.enable_output("hdmi2", False)
        self.main_zone.enable_output.assert_called_with("hdmi2", False)
