"""Test the Emulated Hue component."""
from unittest.mock import MagicMock, Mock, patch

from homeassistant.components.emulated_hue import (
    CONF_CLIENT_USERNAME,
    CONF_LINK_BUTTON_ENTITY,
    DEFAULT_HUE_API_USERNAME,
    Config,
)


def test_config_google_home_entity_id_to_number():
    """Test config adheres to the type."""
    mock_hass = Mock()
    mock_hass.config.path = MagicMock("path", return_value="test_path")
    conf = Config(mock_hass, {"type": "google_home"})

    with patch(
        "homeassistant.components.emulated_hue.load_json",
        return_value={"1": "light.test2"},
    ) as json_loader:
        with patch("homeassistant.components.emulated_hue.save_json") as json_saver:
            number = conf.entity_id_to_number("light.test")
            assert number == "2"

            assert json_saver.mock_calls[0][1][1] == {
                "1": "light.test2",
                "2": "light.test",
            }

            assert json_saver.call_count == 1
            assert json_loader.call_count == 1

            number = conf.entity_id_to_number("light.test")
            assert number == "2"
            assert json_saver.call_count == 1

            number = conf.entity_id_to_number("light.test2")
            assert number == "1"
            assert json_saver.call_count == 1

            entity_id = conf.number_to_entity_id("1")
            assert entity_id == "light.test2"


def test_config_google_home_entity_id_to_number_altered():
    """Test config adheres to the type."""
    mock_hass = Mock()
    mock_hass.config.path = MagicMock("path", return_value="test_path")
    conf = Config(mock_hass, {"type": "google_home"})

    with patch(
        "homeassistant.components.emulated_hue.load_json",
        return_value={"21": "light.test2"},
    ) as json_loader:
        with patch("homeassistant.components.emulated_hue.save_json") as json_saver:
            number = conf.entity_id_to_number("light.test")
            assert number == "22"
            assert json_saver.call_count == 1
            assert json_loader.call_count == 1

            assert json_saver.mock_calls[0][1][1] == {
                "21": "light.test2",
                "22": "light.test",
            }

            number = conf.entity_id_to_number("light.test")
            assert number == "22"
            assert json_saver.call_count == 1

            number = conf.entity_id_to_number("light.test2")
            assert number == "21"
            assert json_saver.call_count == 1

            entity_id = conf.number_to_entity_id("21")
            assert entity_id == "light.test2"


def test_config_google_home_entity_id_to_number_empty():
    """Test config adheres to the type."""
    mock_hass = Mock()
    mock_hass.config.path = MagicMock("path", return_value="test_path")
    conf = Config(mock_hass, {"type": "google_home"})

    with patch(
        "homeassistant.components.emulated_hue.load_json", return_value={}
    ) as json_loader:
        with patch("homeassistant.components.emulated_hue.save_json") as json_saver:
            number = conf.entity_id_to_number("light.test")
            assert number == "1"
            assert json_saver.call_count == 1
            assert json_loader.call_count == 1

            assert json_saver.mock_calls[0][1][1] == {"1": "light.test"}

            number = conf.entity_id_to_number("light.test")
            assert number == "1"
            assert json_saver.call_count == 1

            number = conf.entity_id_to_number("light.test2")
            assert number == "2"
            assert json_saver.call_count == 2

            entity_id = conf.number_to_entity_id("2")
            assert entity_id == "light.test2"


def test_config_alexa_entity_id_to_number():
    """Test config adheres to the type."""
    conf = Config(None, {"type": "alexa"})

    number = conf.entity_id_to_number("light.test")
    assert number == "light.test"

    number = conf.entity_id_to_number("light.test")
    assert number == "light.test"

    number = conf.entity_id_to_number("light.test2")
    assert number == "light.test2"

    entity_id = conf.number_to_entity_id("light.test")
    assert entity_id == "light.test"


def test_config_client_username_has_default():
    """Test config adheres to the type."""
    conf = Config(None, {})
    assert conf.client_username == DEFAULT_HUE_API_USERNAME


def test_config_client_username():
    """Test config adheres to the type."""
    conf = Config(None, {CONF_CLIENT_USERNAME: "test_value"})
    assert conf.client_username == "test_value"


def test_config_link_button_entity():
    """Test config adheres to the type."""
    conf = Config(None, {CONF_LINK_BUTTON_ENTITY: "input_boolean.some_button"})
    assert conf.link_button_entity_id == "input_boolean.some_button"
