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

from homeassistant.components.emulated_hue import 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"
