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

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, 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, 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, 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"