import pytest

from akkudoktoreos.devices.heatpump import Heatpump


@pytest.fixture(scope="function")
def hp_5kw_24h() -> Heatpump:
    """Heatpump with 5 kW heating power and 24 h prediction."""
    return Heatpump(5000, 24)


class TestHeatpump:
    def test_cop(self, hp_5kw_24h: Heatpump):
        """Testing calculate COP for various outside temperatures."""
        assert hp_5kw_24h.calculate_cop(-10) == 2.0
        assert hp_5kw_24h.calculate_cop(0) == 3.0
        assert hp_5kw_24h.calculate_cop(10) == 4.0
        # Check edge case for outside temperature
        out_temp_min = -100.1
        out_temp_max = 100.1
        with pytest.raises(ValueError, match=f"'{out_temp_min}' not in range"):
            hp_5kw_24h.calculate_cop(out_temp_min)
        with pytest.raises(ValueError, match=f"'{out_temp_max}' not in range"):
            hp_5kw_24h.calculate_cop(out_temp_max)

    def test_heating_output(self, hp_5kw_24h: Heatpump):
        """Testing calculation of heating output."""
        assert hp_5kw_24h.calculate_heating_output(-10.0) == 5000
        assert hp_5kw_24h.calculate_heating_output(0.0) == 5000
        assert hp_5kw_24h.calculate_heating_output(10.0) == pytest.approx(4939.583)

    def test_heating_power(self, hp_5kw_24h: Heatpump):
        """Testing calculation of heating power."""
        assert hp_5kw_24h.calculate_heat_power(-10.0) == 2104
        assert hp_5kw_24h.calculate_heat_power(0.0) == 1164
        assert hp_5kw_24h.calculate_heat_power(10.0) == 548
