"""Tests for EQ3 Max! component."""

from unittest.mock import create_autospec, patch

from maxcube.device import MAX_DEVICE_MODE_AUTOMATIC, MAX_DEVICE_MODE_MANUAL
from maxcube.room import MaxRoom
from maxcube.thermostat import MaxThermostat
from maxcube.wallthermostat import MaxWallThermostat
from maxcube.windowshutter import MaxWindowShutter
import pytest

from homeassistant.components.maxcube import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType
from homeassistant.setup import async_setup_component
from homeassistant.util.dt import now


@pytest.fixture
def room():
    """Create a test MAX! room."""
    r = MaxRoom()
    r.id = 1
    r.name = "TestRoom"
    return r


@pytest.fixture
def thermostat():
    """Create test MAX! thermostat."""
    t = create_autospec(MaxThermostat)
    t.name = "TestThermostat"
    t.serial = "AABBCCDD01"
    t.rf_address = "abc1"
    t.room_id = 1
    t.is_thermostat.return_value = True
    t.is_wallthermostat.return_value = False
    t.is_windowshutter.return_value = False
    t.mode = MAX_DEVICE_MODE_AUTOMATIC
    t.comfort_temperature = 19.0
    t.eco_temperature = 14.0
    t.target_temperature = 20.5
    t.actual_temperature = 19.0
    t.max_temperature = None
    t.min_temperature = None
    t.valve_position = 25  # 25%
    t.battery = 1
    return t


@pytest.fixture
def wallthermostat():
    """Create test MAX! wall thermostat."""
    t = create_autospec(MaxWallThermostat)
    t.name = "TestWallThermostat"
    t.serial = "AABBCCDD02"
    t.rf_address = "abc2"
    t.room_id = 1
    t.is_thermostat.return_value = False
    t.is_wallthermostat.return_value = True
    t.is_windowshutter.return_value = False
    t.mode = MAX_DEVICE_MODE_MANUAL
    t.comfort_temperature = 19.0
    t.eco_temperature = 14.0
    t.target_temperature = 4.5
    t.actual_temperature = 19.0
    t.max_temperature = 29.0
    t.min_temperature = 4.5
    t.battery = 1
    return t


@pytest.fixture
def windowshutter():
    """Create test MAX! window shutter."""
    shutter = create_autospec(MaxWindowShutter)
    shutter.name = "TestShutter"
    shutter.serial = "AABBCCDD03"
    shutter.rf_address = "abc3"
    shutter.room_id = 1
    shutter.is_open = True
    shutter.is_thermostat.return_value = False
    shutter.is_wallthermostat.return_value = False
    shutter.is_windowshutter.return_value = True
    shutter.battery = 1
    return shutter


@pytest.fixture
def hass_config():
    """Return test HASS configuration."""
    return {
        DOMAIN: {
            "gateways": [
                {
                    "host": "1.2.3.4",
                }
            ]
        }
    }


@pytest.fixture
async def cube(
    hass: HomeAssistant,
    hass_config: ConfigType,
    room,
    thermostat,
    wallthermostat,
    windowshutter,
):
    """Build and setup a cube mock with a single room and some devices."""
    with patch("homeassistant.components.maxcube.MaxCube") as mock:
        cube = mock.return_value
        cube.rooms = [room]
        cube.devices = [thermostat, wallthermostat, windowshutter]
        cube.room_by_id.return_value = room
        cube.devices_by_room.return_value = [thermostat, wallthermostat, windowshutter]
        assert await async_setup_component(hass, DOMAIN, hass_config)
        await hass.async_block_till_done()
        gateway = hass_config[DOMAIN]["gateways"][0]
        mock.assert_called_with(gateway["host"], gateway.get("port", 62910), now=now)
        return cube