"""The test for the fido sensor platform."""
import asyncio
import logging
import sys
from unittest.mock import MagicMock

from homeassistant.bootstrap import async_setup_component
from homeassistant.components.sensor import fido
from tests.common import assert_setup_component


CONTRACT = "123456789"


class FidoClientMock():
    """Fake Fido client."""

    def __init__(self, username, password, timeout=None, httpsession=None):
        """Fake Fido client init."""
        pass

    def get_phone_numbers(self):
        """Return Phone numbers."""
        return ["1112223344"]

    def get_data(self):
        """Return fake fido data."""
        return {"balance": 160.12,
                "1112223344": {"data_remaining": 100.33}}

    @asyncio.coroutine
    def fetch_data(self):
        """Return fake fetching data."""
        pass


class FidoClientMockError(FidoClientMock):
    """Fake Fido client error."""

    @asyncio.coroutine
    def fetch_data(self):
        """Return fake fetching data."""
        raise PyFidoErrorMock("Fake Error")


class PyFidoErrorMock(Exception):
    """Fake PyFido Error."""


class PyFidoClientFakeModule():
    """Fake pyfido.client module."""

    PyFidoError = PyFidoErrorMock


class PyFidoFakeModule():
    """Fake pyfido module."""

    FidoClient = FidoClientMockError


def fake_async_add_entities(component, update_before_add=False):
    """Fake async_add_entities function."""
    pass


@asyncio.coroutine
def test_fido_sensor(loop, hass):
    """Test the Fido number sensor."""
    sys.modules['pyfido'] = MagicMock()
    sys.modules['pyfido.client'] = MagicMock()
    sys.modules['pyfido.client.PyFidoError'] = \
        PyFidoErrorMock
    import pyfido.client
    pyfido.FidoClient = FidoClientMock
    pyfido.client.PyFidoError = PyFidoErrorMock
    config = {
        'sensor': {
            'platform': 'fido',
            'name': 'fido',
            'username': 'myusername',
            'password': 'password',
            'monitored_variables': [
                'balance',
                'data_remaining',
            ],
        }
    }
    with assert_setup_component(1):
        yield from async_setup_component(hass, 'sensor', config)
    state = hass.states.get('sensor.fido_1112223344_balance')
    assert state.state == "160.12"
    assert state.attributes.get('number') == "1112223344"
    state = hass.states.get('sensor.fido_1112223344_data_remaining')
    assert state.state == "100.33"


@asyncio.coroutine
def test_error(hass, caplog):
    """Test the Fido sensor errors."""
    caplog.set_level(logging.ERROR)
    sys.modules['pyfido'] = PyFidoFakeModule()
    sys.modules['pyfido.client'] = PyFidoClientFakeModule()

    config = {}
    fake_async_add_entities = MagicMock()
    yield from fido.async_setup_platform(hass, config,
                                         fake_async_add_entities)
    assert fake_async_add_entities.called is False