import pytest
from etl.epc_clean.epc_attributes.MainheatControlAttributes import MainheatControlAttributes
from etl.epc_clean.tests.test_data.test_mainheat_control_attributes_cases import mainheat_control_cases


class TestMainHeatControlAttributes:

    def test_init(self):
        # Test initialization with a valid description
        valid_description = 'Flat rate charging, no thermostatic control of room temperature'
        attr = MainheatControlAttributes(valid_description)
        assert attr.description == valid_description.lower()

        # Test initialization with a description that contains none of the keywords
        with pytest.raises(ValueError):
            MainheatControlAttributes('description without keywords')

    def test_empty_str(self):
        assert MainheatControlAttributes("").process() == {
            'thermostatic_control': False, 'charging_system': False, 'switch_system': False, 'no_control': False,
            'dhw_control': False, 'community_heating': False, 'multiple_room_thermostats': False,
            'auxiliary_systems': False, 'trvs': False, 'rate_control': False
        }

        assert set(list(MainheatControlAttributes("").process().values())) == {False}

    @pytest.mark.parametrize(
        "test_case",
        mainheat_control_cases
    )
    def test_process_mainheat(self, test_case):
        expected_result = test_case.copy()
        del expected_result["original_description"]
        result = MainheatControlAttributes(test_case['original_description']).process()
        # Some of the expected_result test data was produced before some attributes were added to the code
        # base so we need to filter out some of the keys. The test is still valid
        result = {k: v for k, v in result.items() if v}
        expected_result = {k: v for k, v in expected_result.items() if v}
        assert sorted(result.items()) == sorted(expected_result.items())

    def test_invalid_description(self):
        # Test that invalid descriptions raise a ValueError
        invalid_descriptions = [
            "invalid description",
            "description with no known heating control data_types",
        ]

        for description in invalid_descriptions:
            with pytest.raises(ValueError):
                MainheatControlAttributes(description).process()

    def test_process_with_no_data(self):
        # Create an instance of MainheatControlAttributes with no description
        attributes = MainheatControlAttributes(description="")

        # Call the process method
        result = attributes.process()

        # Assert that the result matches the expected dictionary
        assert result == {
            "thermostatic_control": False,
            "charging_system": False,
            "switch_system": False,
            "no_control": False,
            "dhw_control": False,
            "community_heating": False,
            "multiple_room_thermostats": False,
            "auxiliary_systems": False,
            "trvs": False,
            "rate_control": False
        }
