"""The tests for the panel_custom component."""
from unittest.mock import Mock, patch

from homeassistant import setup
from homeassistant.components import frontend


async def test_webcomponent_custom_path_not_found(hass):
    """Test if a web component is found in config panels dir."""
    filename = 'mock.file'

    config = {
        'panel_custom': {
            'name': 'todomvc',
            'webcomponent_path': filename,
            'sidebar_title': 'Sidebar Title',
            'sidebar_icon': 'mdi:iconicon',
            'url_path': 'nice_url',
            'config': 5,
        }
    }

    with patch('os.path.isfile', Mock(return_value=False)):
        result = await setup.async_setup_component(
            hass, 'panel_custom', config
        )
        assert not result
        assert len(hass.data.get(frontend.DATA_PANELS, {})) == 0


async def test_webcomponent_custom_path(hass):
    """Test if a web component is found in config panels dir."""
    filename = 'mock.file'

    config = {
        'panel_custom': {
            'name': 'todo-mvc',
            'webcomponent_path': filename,
            'sidebar_title': 'Sidebar Title',
            'sidebar_icon': 'mdi:iconicon',
            'url_path': 'nice_url',
            'config': {
                'hello': 'world',
            }
        }
    }

    with patch('os.path.isfile', Mock(return_value=True)):
        with patch('os.access', Mock(return_value=True)):
            result = await setup.async_setup_component(
                hass, 'panel_custom', config
            )
            assert result

            panels = hass.data.get(frontend.DATA_PANELS, [])

            assert panels
            assert 'nice_url' in panels

            panel = panels['nice_url']

            assert panel.config == {
                'hello': 'world',
                '_panel_custom': {
                    'html_url': '/api/panel_custom/todo-mvc',
                    'name': 'todo-mvc',
                    'embed_iframe': False,
                    'trust_external': False,
                },
            }
            assert panel.frontend_url_path == 'nice_url'
            assert panel.sidebar_icon == 'mdi:iconicon'
            assert panel.sidebar_title == 'Sidebar Title'


async def test_js_webcomponent(hass):
    """Test if a web component is found in config panels dir."""
    config = {
        'panel_custom': {
            'name': 'todo-mvc',
            'js_url': '/local/bla.js',
            'sidebar_title': 'Sidebar Title',
            'sidebar_icon': 'mdi:iconicon',
            'url_path': 'nice_url',
            'config': {
                'hello': 'world',
            },
            'embed_iframe': True,
            'trust_external_script': True,
        }
    }

    result = await setup.async_setup_component(
        hass, 'panel_custom', config
    )
    assert result

    panels = hass.data.get(frontend.DATA_PANELS, [])

    assert panels
    assert 'nice_url' in panels

    panel = panels['nice_url']

    assert panel.config == {
        'hello': 'world',
        '_panel_custom': {
            'js_url': '/local/bla.js',
            'name': 'todo-mvc',
            'embed_iframe': True,
            'trust_external': True,
        }
    }
    assert panel.frontend_url_path == 'nice_url'
    assert panel.sidebar_icon == 'mdi:iconicon'
    assert panel.sidebar_title == 'Sidebar Title'


async def test_module_webcomponent(hass):
    """Test if a js module is found in config panels dir."""
    config = {
        'panel_custom': {
            'name': 'todo-mvc',
            'module_url': '/local/bla.js',
            'sidebar_title': 'Sidebar Title',
            'sidebar_icon': 'mdi:iconicon',
            'url_path': 'nice_url',
            'config': {
                'hello': 'world',
            },
            'embed_iframe': True,
            'trust_external_script': True,
        }
    }

    result = await setup.async_setup_component(
        hass, 'panel_custom', config
    )
    assert result

    panels = hass.data.get(frontend.DATA_PANELS, [])

    assert panels
    assert 'nice_url' in panels

    panel = panels['nice_url']

    assert panel.config == {
        'hello': 'world',
        '_panel_custom': {
            'module_url': '/local/bla.js',
            'name': 'todo-mvc',
            'embed_iframe': True,
            'trust_external': True,
        }
    }
    assert panel.frontend_url_path == 'nice_url'
    assert panel.sidebar_icon == 'mdi:iconicon'
    assert panel.sidebar_title == 'Sidebar Title'


async def test_url_option_conflict(hass):
    """Test config with multiple url options."""
    to_try = [
        {'panel_custom': {
            'name': 'todo-mvc',
            'module_url': '/local/bla.js',
            'js_url': '/local/bla.js',
        }
        }, {'panel_custom': {
            'name': 'todo-mvc',
            'webcomponent_path': '/local/bla.html',
            'js_url': '/local/bla.js',
        }}, {'panel_custom': {
            'name': 'todo-mvc',
            'webcomponent_path': '/local/bla.html',
            'module_url': '/local/bla.js',
            'js_url': '/local/bla.js',
        }}
    ]

    for config in to_try:
        result = await setup.async_setup_component(
            hass, 'panel_custom', config
        )
        assert not result
