from datatypes.epc.main_heating import EpcHeatingSystems
from datatypes.epc.efficiency import EpcEfficiency
from datatypes.epc.fuel import EpcFuel
from datatypes.epc.heating_controls import EpcHeatingControls
from datatypes.epc.hotwater import EpcHotWaterSystems

heating_map = {
    # 0
    ('Boilers', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 1
    ('Boilers', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 2
    ('Boilers', 'A', 'ElectricityNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 3
    ('Boilers', 'A', 'LPGNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 4
    ('Boilers', 'A', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 5
    ('Boilers', 'A', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 6
    ('Boilers', 'A', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.VERY_GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 7
    ('Boilers', 'B', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 8
    ('Boilers', 'B', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 9
    ('Boilers', 'B', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 10
    ('Boilers', 'C', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 11
    ('Boilers', 'C', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 12
    ('Boilers', 'C', 'ElectricityNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 13
    ('Boilers', 'C', 'LPGNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 14
    ('Boilers', 'C', 'LPGNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_lpg, EpcEfficiency.POOR, EpcFuel.lpg_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 15
    ('Boilers', 'C', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 16
    ('Boilers', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 17
    ('Boilers', 'C', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    ('Boilers', 'C', 'OilNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 19
    ('Boilers', 'C', 'OilNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 20
    ('Boilers', 'C', 'OilNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 21
    ('Boilers', 'D', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 22
    ('Boilers', 'D', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 23
    ('Boilers', 'D', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 24
    ('Boilers', 'E', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_and_radiators_electric, EpcEfficiency.VERY_POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 25
    ('Boilers', 'E', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 26
    ('Boilers', 'E', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 27
    ('Boilers', 'E', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 28
    ('Boilers', 'E', 'OilNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 29
    ('Boilers', 'E', 'OilNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_oil, EpcEfficiency.AVERAGE, EpcFuel.oil_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 30
    ('Boilers', 'F', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 31
    ('Boilers', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 32
    ('Boilers', 'F', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 33
    ('Boilers', 'G', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 34
    ('Boilers', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 35
    ('Boilers', 'G', 'MainsGasNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.boiler_radiators_mains_gas, EpcEfficiency.AVERAGE, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 36
    ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 37
    ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 38
    ('Electric underfloor', 'A', 'ElectricityNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.electric_underfloor_heating, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 39
    ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.air_to_air_ashp, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 40
    ('Heat pumps (warm air)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.air_to_air_ashp, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 41
    ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_room_thermostat_trvs, EpcEfficiency.GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 42
    ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmers_trvs_bypass, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 43
    ('Heat pumps (wet)', 'A', 'ElectricityNotCommunity', 'Top Spec'): (
        EpcHeatingSystems.ashp_radiators_electric, EpcEfficiency.GOOD, EpcFuel.electricity_not_community,
        EpcHeatingControls.time_and_temperature_zone_control, EpcEfficiency.VERY_GOOD,
        EpcHotWaterSystems.from_main_system, EpcEfficiency.AVERAGE
    ),
    # 44
    ('Room heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.room_heaters_electric, EpcEfficiency.POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_and_appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 45
    ('Room heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.room_heaters_electric, EpcEfficiency.POOR, EpcFuel.electricity_not_community,
        EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 46
    ('Room heaters', 'C', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.AVERAGE, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    # 47 - water done from here
    ('Room heaters', 'F', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Room heaters', 'G', 'MainsGasNotCommunity', 'Optimal'): (
        EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_and_appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Room heaters', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.room_heaters_mains_gas, EpcEfficiency.POOR, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Room heaters', 'G', 'SmokelessCoal', 'Sub Optimal'): (
        EpcHeatingSystems.room_heaters_smokeless_fuel, EpcEfficiency.VERY_POOR, EpcFuel.smokeless_coal,
        EpcHeatingControls.appliance_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Optimal'): (
        EpcHeatingSystems.electric_storage_heaters, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.automatic_charge_control, EpcEfficiency.AVERAGE,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Storage heaters', 'A', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.electric_storage_heaters, EpcEfficiency.AVERAGE, EpcFuel.electricity_not_community,
        EpcHeatingControls.manual_charge_control, EpcEfficiency.POOR,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Warm Air (not heat pump)', 'G', 'ElectricityNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.warm_air_electricaire, EpcEfficiency.GOOD, EpcFuel.electricity_not_community,
        EpcHeatingControls.programmer_and_atleast_two_room_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    ),
    ('Warm Air (not heat pump)', 'G', 'MainsGasNotCommunity', 'Sub Optimal'): (
        EpcHeatingSystems.warm_air_mains_gas, EpcEfficiency.GOOD, EpcFuel.mains_gas_not_community,
        EpcHeatingControls.programmer_and_atleast_two_room_thermostats, EpcEfficiency.GOOD,
        EpcHotWaterSystems.electric_immersion_off_peak, EpcEfficiency.AVERAGE
    )
}
