from datetime import date

from backend.condition.domain.aspect_condition import AspectCondition
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.element_type import ElementType
from backend.condition.domain.mapping.lbwf.lbwf_mapper import LbwfMapper
from backend.condition.domain.property_condition_survey import PropertyConditionSurvey
from backend.condition.parsing.records.lbwf.lbwf_house import LbwfHouse
from backend.condition.parsing.records.lbwf.lbwf_asset_condition import (
    LbwfAssetCondition,
)
from backend.condition.domain.element import Element
from backend.condition.tests.custom_asserts import CustomAsserts


def test_lbwf_mapper_maps_house():
    # arrange
    lbwf_house = LbwfHouse(
        uprn=1,
        reference=100,
        address="123 Fake Street, London, A10 1AB",
        epc="F",
        shdf="NO",
        house="HOUSE",
        fail_decency=2025,
        assets=[
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="AHR_CAT",
                element_code_description="Accessible Housing Register Category",
                attribute_code="F",
                attribute_code_description="General Needs",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=None,
                remaining_life=None,
                element_comments=None,
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="FLVL",
                element_code_description="Floor Level of Front Door",
                attribute_code="0G",
                attribute_code_description="Ground Floor",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=None,
                remaining_life=None,
                element_comments=None,
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="ASBESTOS",
                element_code_description="Asbestos Present",
                attribute_code="YES",
                attribute_code_description="Yes",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=None,
                install_date=None,
                remaining_life=None,
                element_comments="Source of Data = ACT",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="HHSRSASB",
                element_code_description="Asbestos (and MMF)",
                attribute_code="TYPRISK",
                attribute_code_description="Category 4 - Typical Risk",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=None,
                install_date=None,
                remaining_life=None,
                element_comments="Source of Data = ACT",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="INTBTHRLOC",
                element_code_description="Location of Bathroom in Property",
                attribute_code="ENTRANCE",
                attribute_code_description="Bathroom on Entrance Level in Property",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=None,
                remaining_life=None,
                element_comments="Source of Data = Codeman",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="INTCHEXTNT",
                element_code_description="Extent of Central Heating in Property",
                attribute_code="NONE",
                attribute_code_description="No Central Heating in Property",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=None,
                remaining_life=None,
                element_comments="Source of Data = Codeman",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="HHSRSFIRE",
                element_code_description="Fire",
                attribute_code="TYPRISK",
                attribute_code_description="Category 4 - Typical Risk",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=None,
                remaining_life=None,
                element_comments="Source of Data = Morgan Sindall",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="EXTWALLFN1",
                element_code_description="Wall Finish 1 in External Area",
                attribute_code="SMTHRENDER",
                attribute_code_description="Render or Pebbledash in External Area",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=date(2009, 4, 1),
                remaining_life=26,
                element_comments="Source of Data = Codeman",
            ),
            LbwfAssetCondition(
                prop_ref=100,
                domna=100,
                address="123 Fake Street, London, A10 1AB",
                ownership="LBWF_OWNED",
                prop_status="OCCP",
                prop_type="HOU",
                prop_sub_type="TERRACED",
                element_group="ASSETS",
                element_code="EXTWALLFN2",
                element_code_description="Wall Finish 2 in External Area",
                attribute_code="SMTHRENDER",
                attribute_code_description="Smooth Render Wall Finish 2 in External Area",
                element_date_value=None,
                element_numerical_value=None,
                element_text_value=None,
                quantity=1,
                install_date=date(2009, 4, 1),
                remaining_life=26,
                element_comments="Source of Data = Codeman",
            ),
        ],
    )
    mapper = LbwfMapper()

    survey_year = 2026

    expected_condition_survey = PropertyConditionSurvey(
        uprn=1,
        elements=[
            Element(
                element_type=ElementType.ACCESSIBLE_HOUSING_REGISTER,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.CATEGORY,
                        aspect_instance=1,
                        value="General Needs",
                        quantity=1,
                        install_date=None,
                        renewal_year=None,
                        comments=None,
                    )
                ],
            ),
            Element(
                element_type=ElementType.FLOOR_LEVEL_FRONT_DOOR,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.LOCATION,
                        aspect_instance=1,
                        value="Ground Floor",
                        quantity=1,
                        install_date=None,
                        renewal_year=None,
                        comments=None,
                    )
                ],
            ),
            Element(
                element_type=ElementType.ASBESTOS,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.PRESENCE,
                        aspect_instance=1,
                        value="Yes",
                        quantity=None,
                        install_date=None,
                        renewal_year=None,
                        comments="Source of Data = ACT",
                    )
                ],
            ),
            Element(
                element_type=ElementType.HHSRS_ASBESTOS_AND_MMF,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.RISK,
                        aspect_instance=1,
                        value="Category 4 - Typical Risk",
                        quantity=None,
                        renewal_year=None,
                        comments="Source of Data = ACT",
                    )
                ],
            ),
            Element(
                element_type=ElementType.BATHROOM,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.LOCATION,
                        aspect_instance=1,
                        value="Bathroom on Entrance Level in Property",
                        quantity=1,
                        install_date=None,
                        renewal_year=None,
                        comments="Source of Data = Codeman",
                    )
                ],
            ),
            Element(
                element_type=ElementType.CENTRAL_HEATING,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.EXTENT,
                        aspect_instance=1,
                        value="No Central Heating in Property",
                        quantity=1,
                        install_date=None,
                        renewal_year=None,
                        comments="Source of Data = Codeman",
                    )
                ],
            ),
            Element(
                element_type=ElementType.HHSRS_FIRE,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.RISK,
                        aspect_instance=1,
                        value="Category 4 - Typical Risk",
                        quantity=1,
                        install_date=None,
                        renewal_year=None,
                        comments="Source of Data = Morgan Sindall",
                    )
                ],
            ),
            Element(
                element_type=ElementType.EXTERNAL_WALL,
                element_instance=1,
                aspect_conditions=[
                    AspectCondition(
                        aspect_type=AspectType.FINISH,
                        aspect_instance=1,
                        value="Render or Pebbledash in External Area",
                        quantity=1,
                        install_date=date(2009, 4, 1),
                        renewal_year=2052,
                        comments="Source of Data = Codeman",
                    ),
                    AspectCondition(
                        aspect_type=AspectType.FINISH,
                        aspect_instance=2,
                        value="Smooth Render Wall Finish 2 in External Area",
                        quantity=1,
                        install_date=date(2009, 4, 1),
                        renewal_year=2052,
                        comments="Source of Data = Codeman",
                    ),
                ],
            ),
        ],
        date=date(2000, 1, 1),  # what should this be?
        source="LBWF",
    )

    # act
    actual_condition_survey: PropertyConditionSurvey = (
        mapper.map_asset_conditions_for_property(lbwf_house, survey_year)
    )

    # assert
    assert CustomAsserts.assert_property_condition_surveys_equal(
        actual_condition_survey, expected_condition_survey
    )
