"""The tests for the Pilight sensor platform."""
import logging

from homeassistant.bootstrap import setup_component
import homeassistant.components.sensor as sensor
from homeassistant.components import pilight

from tests.common import get_test_home_assistant, assert_setup_component

HASS = None


def fire_pilight_message(protocol, data):
    """Fire the fake pilight message."""
    message = {pilight.ATTR_PROTOCOL: protocol}
    message.update(data)
    HASS.bus.fire(pilight.EVENT, message)


# pylint: disable=invalid-name
def setup_function():
    """Initialize a Home Assistant server."""
    global HASS

    HASS = get_test_home_assistant()
    HASS.config.components = ['pilight']


# pylint: disable=invalid-name
def teardown_function():
    """Stop the Home Assistant server."""
    HASS.stop()


def test_sensor_value_from_code():
    """Test the setting of value via pilight."""
    with assert_setup_component(1):
        setup_component(HASS, sensor.DOMAIN, {
            sensor.DOMAIN: {
                'platform': 'pilight',
                'name': 'test',
                'variable': 'test',
                'payload': {'protocol': 'test-protocol'},
                'unit_of_measurement': 'fav unit'
            }
        })

        state = HASS.states.get('sensor.test')
        assert state.state == 'unknown'

        unit_of_measurement = state.attributes.get('unit_of_measurement')
        assert unit_of_measurement == 'fav unit'

        # Set value from data with correct payload
        fire_pilight_message(protocol='test-protocol',
                             data={'test': 42})
        HASS.block_till_done()
        state = HASS.states.get('sensor.test')
        assert state.state == '42'


def test_disregard_wrong_payload():
    """Test omitting setting of value with wrong payload."""
    with assert_setup_component(1):
        setup_component(HASS, sensor.DOMAIN, {
            sensor.DOMAIN: {
                'platform': 'pilight',
                'name': 'test_2',
                'variable': 'test',
                'payload': {'uuid': '1-2-3-4',
                            'protocol': 'test-protocol_2'}
            }
        })

        # Try set value from data with incorrect payload
        fire_pilight_message(protocol='test-protocol_2',
                             data={'test': 'data',
                                   'uuid': '0-0-0-0'})
        HASS.block_till_done()
        state = HASS.states.get('sensor.test_2')
        assert state.state == 'unknown'

        # Try set value from data with partially matched payload
        fire_pilight_message(protocol='wrong-protocol',
                             data={'test': 'data',
                                   'uuid': '1-2-3-4'})
        HASS.block_till_done()
        state = HASS.states.get('sensor.test_2')
        assert state.state == 'unknown'

        # Try set value from data with fully matched payload
        fire_pilight_message(protocol='test-protocol_2',
                             data={'test': 'data',
                                   'uuid': '1-2-3-4',
                                   'other_payload': 3.141})
        HASS.block_till_done()
        state = HASS.states.get('sensor.test_2')
        assert state.state == 'data'


def test_variable_missing(caplog):
    """Check if error message when variable missing."""
    caplog.set_level(logging.ERROR)
    with assert_setup_component(1):
        setup_component(HASS, sensor.DOMAIN, {
            sensor.DOMAIN: {
                'platform': 'pilight',
                'name': 'test_3',
                'variable': 'test',
                'payload': {'protocol': 'test-protocol'}
            }
        })

        # Create code without sensor variable
        fire_pilight_message(protocol='test-protocol',
                             data={'uuid': '1-2-3-4',
                                   'other_variable': 3.141})
        HASS.block_till_done()

        logs = caplog.text

        assert 'No variable test in received code' in logs