from datatypes.epc.construction_age_band import EpcConstructionAgeBand
from datatypes.epc.walls import EpcWallDescriptions


def map_cavity_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1976:
        return EpcWallDescriptions.cavity_no_insulation_assumed

    if age_band == EpcConstructionAgeBand.from_1976_to_1982:
        return EpcWallDescriptions.cavity_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.cavity_insulated_assumed

    raise NotImplementedError(f"Age band {age_band} not handled for cavity wall as built insulation mapping")


def map_solid_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1976:
        return EpcWallDescriptions.solid_brick_no_insulation_assumed

    if age_band == EpcConstructionAgeBand.from_1976_to_1982:
        return EpcWallDescriptions.solid_brick_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.solid_brick_insulated_assumed

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for solid wall insulation mapping"
    )


def map_timber_frame_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1950:
        return EpcWallDescriptions.timber_frame_no_insulation_assumed

    if age_band.start_year() < 1976:
        return EpcWallDescriptions.timber_frame_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1976):
        return EpcWallDescriptions.timber_frame_insulated_assumed

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for timber frame wall insulation mapping"
    )


def map_system_build_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1976:
        return EpcWallDescriptions.system_no_insulation_assumed

    if age_band == EpcConstructionAgeBand.from_1976_to_1982:
        return EpcWallDescriptions.system_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.system_insulated_assumed

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for system build wall insulation mapping"
    )


def map_granite_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1976:
        return EpcWallDescriptions.granite_whinstone_no_insulation_assumed

    if age_band == EpcConstructionAgeBand.from_1976_to_1982:
        return EpcWallDescriptions.granite_whinstone_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.granite_whinestone_insulated_assumed

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for granite wall insulation mapping"
    )


def map_sandstone_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1976:
        return EpcWallDescriptions.sandstone_limestone_no_insulation_assumed

    if age_band == EpcConstructionAgeBand.from_1976_to_1982:
        return EpcWallDescriptions.sandstone_limestone_partial_insulated_assumed

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.sandstone_limestone_insulated_assumed

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for sandstone wall insulation mapping"
    )


def map_cob_wall_insulation(age_band: EpcConstructionAgeBand):
    if age_band.start_year() < 1983:
        return EpcWallDescriptions.cob_as_built_average

    if age_band in EpcConstructionAgeBand.from_year_onwards(1983):
        return EpcWallDescriptions.cob_as_built_good

    raise NotImplementedError(
        f"Age band {age_band.value} not handled for cob wall insulation mapping"
    )


as_built_wall_classifiers = {
    "Cavity": map_cavity_wall_insulation,
    "Solid Brick": map_solid_wall_insulation,
    "Timber Frame": map_timber_frame_wall_insulation,
    "System": map_system_build_wall_insulation,
    "Granite": map_granite_wall_insulation,
    "Sandstone": map_sandstone_wall_insulation,
    "Cob": map_cob_wall_insulation,
}
