# pylint: disable=unused-argument, line-too-long, protected-access
""" Test the Window management """
import asyncio
import logging
from unittest.mock import patch, call
from datetime import datetime, timedelta

from custom_components.versatile_thermostat.thermostat_switch import ThermostatOverSwitch
from .commons import *  # pylint: disable=wildcard-import, unused-wildcard-import

logging.getLogger().setLevel(logging.DEBUG)

@pytest.mark.parametrize("expected_lingering_tasks", [True])
@pytest.mark.parametrize("expected_lingering_timers", [True])
async def test_inverted_switch(hass: HomeAssistant, skip_hass_states_is_state):
    """Test the Window auto management"""

    entry = MockConfigEntry(
        domain=DOMAIN,
        title="TheOverSwitchMockName",
        unique_id="uniqueId",
        data={
            CONF_NAME: "TheOverSwitchMockName",
            CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH,
            CONF_TEMP_SENSOR: "sensor.mock_temp_sensor",
            CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor",
            CONF_CYCLE_MIN: 5,
            CONF_TEMP_MIN: 15,
            CONF_TEMP_MAX: 30,
            "eco_temp": 17,
            "comfort_temp": 18,
            "boost_temp": 21,
            CONF_USE_WINDOW_FEATURE: False,
            CONF_USE_MOTION_FEATURE: False,
            CONF_USE_POWER_FEATURE: False,
            CONF_USE_PRESENCE_FEATURE: False,
            CONF_HEATER: "switch.mock_switch",
            CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI,
            CONF_TPI_COEF_INT: 0.3,
            CONF_TPI_COEF_EXT: 0.01,
            CONF_MINIMAL_ACTIVATION_DELAY: 30,
            CONF_SECURITY_DELAY_MIN: 5,
            CONF_SECURITY_MIN_ON_PERCENT: 0.3,
            CONF_WINDOW_AUTO_OPEN_THRESHOLD: 0.1,
            CONF_WINDOW_AUTO_CLOSE_THRESHOLD: 0.1,
            CONF_WINDOW_AUTO_MAX_DURATION: 0,  # Should be 0 for test
            CONF_INVERSE_SWITCH: True
        },
    )

    with patch(
        "homeassistant.core.ServiceRegistry.async_call"
    ) as mock_service_call, patch(
        "homeassistant.core.StateMachine.is_state", return_value=True # switch is On
    ):
        entity: ThermostatOverSwitch = await create_thermostat(
            hass, entry, "climate.theoverswitchmockname"
        )
        assert entity
        assert entity.is_inversed

        tz = get_tz(hass)  # pylint: disable=invalid-name
        now = datetime.now(tz)

        tpi_algo = entity._prop_algorithm
        assert tpi_algo

        await entity.async_set_hvac_mode(HVACMode.HEAT)
        await entity.async_set_preset_mode(PRESET_BOOST)
        assert entity.hvac_mode is HVACMode.HEAT
        assert entity.preset_mode is PRESET_BOOST
        assert entity.target_temperature == 21
        assert entity.is_device_active is False

        assert mock_service_call.call_count == 0

    # 1. Make the temperature down to activate the switch
    with patch(
        "custom_components.versatile_thermostat.base_thermostat.BaseThermostat.send_event"
    ), patch(
        "homeassistant.core.ServiceRegistry.async_call"
    ) as mock_service_call, patch(
        "homeassistant.core.StateMachine.is_state", return_value=True # switch is Off
    ):
        event_timestamp = now - timedelta(minutes=4)
        await send_temperature_change_event(entity, 19, event_timestamp)

        # The heater turns on
        assert entity.hvac_mode is HVACMode.HEAT
        # not updated cause mocked assert entity.is_device_active is True

        assert mock_service_call.call_count == 1
        mock_service_call.assert_has_calls([
            call.async_call('switch', SERVICE_TURN_OFF, {'entity_id': 'switch.mock_switch'}),
        ])

    # 2. Make the temperature up to deactivate the switch
    with patch(
        "custom_components.versatile_thermostat.base_thermostat.BaseThermostat.send_event"
    ), patch(
        "homeassistant.core.ServiceRegistry.async_call"
    ) as mock_service_call, patch(
        "homeassistant.core.StateMachine.is_state", return_value=False # switch is On -> it should turned off
    ):
        event_timestamp = now - timedelta(minutes=3)
        await send_temperature_change_event(entity, 25, event_timestamp)

        # The heater turns on
        assert entity.hvac_mode is HVACMode.HEAT
        # not updated cause mocked assert entity.is_device_active is False

        # there is no change because the cycle is currenlty running.
        # we should simulate the end of the cycle to see oif underlying switch turns on
        await entity._underlyings[0].turn_off()

        assert mock_service_call.call_count == 1
        mock_service_call.assert_has_calls([
            call.async_call('switch', SERVICE_TURN_ON, {'entity_id': 'switch.mock_switch'}),
        ])



    # Clean the entity
    entity.remove_thermostat()
