"""Test Customize config panel."""
import asyncio
import json
from unittest.mock import patch

from homeassistant.bootstrap import async_setup_component
from homeassistant.components import config
from homeassistant.config import DATA_CUSTOMIZE


@asyncio.coroutine
def test_get_entity(hass, hass_client):
    """Test getting entity."""
    with patch.object(config, "SECTIONS", ["customize"]):
        yield from async_setup_component(hass, "config", {})

    client = yield from hass_client()

    def mock_read(path):
        """Mock reading data."""
        return {"hello.beer": {"free": "beer"}, "other.entity": {"do": "something"}}

    hass.data[DATA_CUSTOMIZE] = {"hello.beer": {"cold": "beer"}}
    with patch("homeassistant.components.config._read", mock_read):
        resp = yield from client.get("/api/config/customize/config/hello.beer")

    assert resp.status == 200
    result = yield from resp.json()

    assert result == {"local": {"free": "beer"}, "global": {"cold": "beer"}}


@asyncio.coroutine
def test_update_entity(hass, hass_client):
    """Test updating entity."""
    with patch.object(config, "SECTIONS", ["customize"]):
        yield from async_setup_component(hass, "config", {})

    client = yield from hass_client()

    orig_data = {
        "hello.beer": {"ignored": True},
        "other.entity": {"polling_intensity": 2},
    }

    def mock_read(path):
        """Mock reading data."""
        return orig_data

    written = []

    def mock_write(path, data):
        """Mock writing data."""
        written.append(data)

    hass.states.async_set("hello.world", "state", {"a": "b"})
    with patch("homeassistant.components.config._read", mock_read), patch(
        "homeassistant.components.config._write", mock_write
    ):
        resp = yield from client.post(
            "/api/config/customize/config/hello.world",
            data=json.dumps(
                {"name": "Beer", "entities": ["light.top", "light.bottom"]}
            ),
        )

    assert resp.status == 200
    result = yield from resp.json()
    assert result == {"result": "ok"}

    state = hass.states.get("hello.world")
    assert state.state == "state"
    assert dict(state.attributes) == {
        "a": "b",
        "name": "Beer",
        "entities": ["light.top", "light.bottom"],
    }

    orig_data["hello.world"]["name"] = "Beer"
    orig_data["hello.world"]["entities"] = ["light.top", "light.bottom"]

    assert written[0] == orig_data


@asyncio.coroutine
def test_update_entity_invalid_key(hass, hass_client):
    """Test updating entity."""
    with patch.object(config, "SECTIONS", ["customize"]):
        yield from async_setup_component(hass, "config", {})

    client = yield from hass_client()

    resp = yield from client.post(
        "/api/config/customize/config/not_entity", data=json.dumps({"name": "YO"})
    )

    assert resp.status == 400


@asyncio.coroutine
def test_update_entity_invalid_json(hass, hass_client):
    """Test updating entity."""
    with patch.object(config, "SECTIONS", ["customize"]):
        yield from async_setup_component(hass, "config", {})

    client = yield from hass_client()

    resp = yield from client.post(
        "/api/config/customize/config/hello.beer", data="not json"
    )

    assert resp.status == 400
