"""Test KNX init."""
import pytest
from xknx import XKNX
from xknx.io import ConnectionConfig, ConnectionType

from homeassistant.components.knx.const import (
    CONF_KNX_AUTOMATIC,
    CONF_KNX_CONNECTION_TYPE,
    CONF_KNX_INDIVIDUAL_ADDRESS,
    CONF_KNX_ROUTING,
    CONF_KNX_TUNNELING,
    DOMAIN as KNX_DOMAIN,
)
from homeassistant.components.knx.schema import ConnectionSchema
from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant

from .conftest import KNXTestKit

from tests.common import MockConfigEntry


@pytest.mark.parametrize(
    "config_entry_data,connection_config",
    [
        (
            {
                CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS,
                CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
            },
            ConnectionConfig(),
        ),
        (
            {
                CONF_KNX_CONNECTION_TYPE: CONF_KNX_ROUTING,
                ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.1",
            },
            ConnectionConfig(
                connection_type=ConnectionType.ROUTING, local_ip="192.168.1.1"
            ),
        ),
        (
            {
                CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING,
                CONF_HOST: "192.168.0.2",
                CONF_PORT: 3675,
                ConnectionSchema.CONF_KNX_ROUTE_BACK: False,
                ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.112",
            },
            ConnectionConfig(
                connection_type=ConnectionType.TUNNELING,
                route_back=False,
                gateway_ip="192.168.0.2",
                gateway_port=3675,
                local_ip="192.168.1.112",
                auto_reconnect=True,
            ),
        ),
    ],
)
async def test_init_connection_handling(
    hass: HomeAssistant, knx: KNXTestKit, config_entry_data, connection_config
):
    """Test correctly generating connection config."""

    config_entry = MockConfigEntry(
        title="KNX",
        domain=KNX_DOMAIN,
        data=config_entry_data,
    )
    knx.mock_config_entry = config_entry
    await knx.setup_integration({})

    assert hass.data.get(KNX_DOMAIN) is not None

    assert (
        hass.data[KNX_DOMAIN].connection_config().__dict__ == connection_config.__dict__
    )