from enum import Enum


class ElementType(str, Enum):

    # ======================
    # PROPERTY / GENERAL
    # ======================
    PROPERTY = "property"
    PROPERTY_CONSTRUCTION_TYPE = "property_construction_type"
    PROPERTY_CLASSIFICATION = "property_classification"
    PROPERTY_AGE_BAND = "property_age_band"
    STOREY_COUNT = "storey_count"
    FLOOR_LEVEL = "floor_level"
    FLOOR_LEVEL_FRONT_DOOR = "floor_level_front_door"
    ACCESSIBLE_HOUSING_REGISTER = "accessible_housing_register"
    ASBESTOS = "asbestos"
    QUALITY_STANDARD = "quality_standard"
    CCU = "ccu"
    PASSENGER_LIFT = "passenger_lift"
    STAIRLIFT = "stairlift"
    DISABLED_HOIST_TRACKING = "disabled_hoist_tracking"
    DISABLED_FACILITIES = "disabled_facilities"
    STEPS_TO_FRONT_DOOR = "steps_to_front_door"

    # ======================
    # EXTERNAL – ROOF
    # ======================
    ROOF = "roof"
    PITCHED_ROOF_COVERING = "pitched_roof_covering"
    FLAT_ROOF_COVERING = "flat_roof_covering"
    RAINWATER_GOODS = "rainwater_goods"
    LOFT_INSULATION = "loft_insulation"
    PORCH_CANOPY = "porch_canopy"
    CHIMNEY = "chimney"
    FASCIA = "fascia"
    SOFFIT = "soffit"
    FASCIA_SOFFIT_BARGEBOARDS = "fascia_soffit_bargeboards"
    GUTTERS = "gutters"
    STORE_ROOF = "store_roof"
    GARAGE_ROOF = "garage_roof"
    GARAGE_AND_STORE_ROOF = "garage_and_store_roof"

    # ======================
    # EXTERNAL – WALLS
    # ======================
    EXTERNAL_WALL = "external_wall"
    EXTERNAL_NOISE_INSULATION = "external_noise_insulation"
    PRIMARY_WALL = "primary_wall"
    SECONDARY_WALL = "secondary_wall"
    DOWNPIPES = "downpipes"
    EXTERNAL_DECORATION = "external_decoration"
    CLADDING = "cladding"
    SPANDREL_PANELS = "spandrel_panels"
    GARAGE_WALLS = "garage_walls"
    PARTY_WALL_FIRE_BREAK = "party_wall_fire_break"
    EXTERNAL_BRICKWORK_POINTING = "external_brickwork_pointing"
    INTERNAL_DOWNPIPES_EXTERNAL_AREA = "internal_downpipes_external_area"

    # ======================
    # EXTERNAL – WINDOWS
    # ======================
    EXTERNAL_WINDOWS = "external_windows"
    COMMUNAL_WINDOWS = "communal_windows"
    SECONDARY_GLAZING = "secondary_glazing"
    STORE_WINDOWS = "store_windows"
    GARAGE_WINDOWS = "garage_windows"
    GARAGE_AND_STORE_WINDOWS = "garage_and_store_windows"

    # ======================
    # EXTERNAL – DOORS
    # ======================
    EXTERNAL_DOOR = "external_door"
    FRONT_DOOR = "front_door"
    REAR_DOOR = "rear_door"
    STORE_DOOR = "store_door"
    GARAGE_DOOR = "garage_door"
    GARAGE_AND_STORE_DOOR = "garage_and_store_door"
    COMMUNAL_ENTRANCE_DOOR = "communal_entrance_door"
    MAIN_DOOR = "main_door"
    BLOCK_ENTRANCE_DOOR = "block_entrance_door"
    LINTEL = "lintel"
    PATIO_FRENCH_DOOR = "patio_french_door"
    DOOR_ENTRY_HANDSET = "door_entry_handset"

    # ======================
    # EXTERNAL – AREAS
    # ======================
    PATHS_AND_HARDSTANDINGS = "paths_and_hardstandings"
    PARKING_AREAS = "parking_areas"
    BOUNDARY_WALLS = "boundary_walls"
    FRONT_FENCING = "front_fencing"
    REAR_FENCING = "rear_fencing"
    SIDE_FENCING = "side_fencing"
    REAR_GATE = "rear_gate"
    FRONT_GATE = "front_gate"
    GATES = "gates"
    RETAINING_WALLS = "retaining_walls"
    PRIVATE_BALCONY = "private_balcony"
    BALCONY_BALUSTRADE = "balcony_balustrade"
    OUTBUILDINGS = "outbuildings"
    GARAGE_STRUCTURE = "garage_structure"
    PAVING = "paving"
    ROADS = "roads"
    SOIL_AND_VENT = "soil_and_vent"
    SOLAR_THERMALS = "solar_thermals"
    DROP_KERB = "drop_kerb"
    OUTBUILDING_OVERHAUL = "outbuilding_overhaul"
    EXTERNAL_STRUCTURAL_DEFECTS = "external_structural_defects"
    ACCESS_RAMP = "access_ramp"

    # ======================
    # INTERNAL – KITCHEN
    # ======================
    KITCHEN = "kitchen"
    KITCHEN_SPACE_LAYOUT = "kitchen_space_layout"
    TENANT_INSTALLED_KITCHEN = "tenant_installed_kitchen"
    KITCHEN_EXTRACTOR_FAN = "kitchen_extractor_fan"

    # ======================
    # INTERNAL – BATHROOM
    # ======================
    BATHROOM = "bathroom"
    SECONDARY_BATHROOM = "secondary_bathroom"
    SECONDARY_TOILET = "secondary_toilet"
    BATHROOM_EXTRACTOR_FAN = "bathroom_extractor_fan"
    ADDITIONAL_WC_OR_WHB = "additional_wc_or_whb"
    BATHROOM_REMAINING_LIFE_SOURCE = "bathroom_remaining_life_source"
    KITCHEN_REMAINING_LIFE_SOURCE = "kitchen_remaining_life_source"

    # ======================
    # INTERNAL – HEATING / WATER
    # ======================
    CENTRAL_HEATING = "central_heating"
    HEATING_BOILER = "heating_boiler"
    HEATING_DISTRIBUTION = "heating_distribution"
    SECONDARY_HEATING = "secondary_heating"
    HOT_WATER_SYSTEM = "hot_water_system"
    COLD_WATER_STORAGE = "cold_water_storage"
    HEATING_SYSTEM = "heating_system"
    BOILER_FUEL = "boiler_fuel"
    WATER_HEATING = "water_heating"
    PROGRAMMABLE_HEATING = "programmable_heating"
    COMMUNITY_HEATING = (
        "community_heating"  # Is this definitely different from COMMUNAL_HEATING?
    )
    GAS_AVAILABLE = "gas_available"
    HEAT_RECOVERY_UNITS = "heat_recovery_units"
    HEATING_IMPROVEMENTS = "heating_improvements"

    # ======================
    # INTERNAL – ELECTRICS / FIRE
    # ======================
    ELECTRICAL_WIRING = "electrical_wiring"
    CONSUMER_UNIT = "consumer_unit"
    SMOKE_DETECTION = "smoke_detection"
    HEAT_DETECTION = "heat_detection"
    CARBON_MONOXIDE_DETECTION = "carbon_monoxide_detection"
    FIRE_DOOR_RATING = "fire_door_rating"
    FIRE_RISK_ASSESSMENT = "fire_risk_assessment"
    INTERNAL_WIRING = (
        "internal_wiring"  # Is this definitely different from ELECTRICAL_WIRING?
    )
    ELECTRICS = "electrics"

    # ======================
    # COMMUNAL
    # ======================
    COMMUNAL_HEATING = "communal_heating"
    COMMUNAL_BOILER = "communal_boiler"
    COMMUNAL_ELECTRICS = "communal_electrics"
    COMMUNAL_FIRE_ALARM = "communal_fire_alarm"
    COMMUNAL_EMERGENCY_LIGHTING = "communal_emergency_lighting"
    COMMUNAL_DOOR_ENTRY = "communal_door_entry"
    COMMUNAL_CCTV = "communal_cctv"
    COMMUNAL_BIN_STORE = "communal_bin_store"
    COMMUNAL_BIN_STORE_DOORS = "communal_bin_store_doors"
    COMMUNAL_BIN_STORE_WALLS = "communal_bin_store_walls"
    COMMUNAL_BIN_STORE_ROOF = "communal_bin_store_roof"
    COMMUNAL_REFUSE_CHUTE = "communal_refuse_chute"
    COMMUNAL_FLOOR_COVERING = "communal_floor_covering"
    COMMUNAL_KITCHEN = "communal_kitchen"
    COMMUNAL_BATHROOM = "communal_bathroom"
    COMMUNAL_TOILETS = "communal_toilets"
    COMMUNAL_GATES = "communal_gates"
    COMMUNAL_LIFT = "communal_lift"
    COMMUNAL_PASSENGER_LIFT = "communal_passenger_lift"
    COMMUNAL_BALCONY_WALKWAY = "communal_balcony_walkway"
    COMMUNAL_ENTRANCE = "communal_entrance"
    COMMUNAL_INTERNAL_DECORATIONS = "communal_internal_decorations"
    COMMUNAL_INTERNAL_FLOOR = "communal_internal_floor"
    COMMUNAL_WALKWAYS = "communal_walkways"
    COMMUNAL_EXTERNAL_DOORS = "communal_external_doors"
    COMMUNAL_STAIRS = "communal_stairs"
    COMMUNAL_AERIAL = "communal_aerial"
    COMMUNAL_AOV = "communal_aov"
    COMMUNAL_INTERNAL_DOORS = "communal_internal_doors"
    COMMUNAL_LATERAL_MAINS = "communal_lateral_mains"
    COMMUNAL_LIGHTING = "communal_lighting"
    COMMUNAL_LIGHTING_CONDUCTOR = "communal_lighting_conductor"
    COMMUNAL_STORE_ROOF = "communal_store_roof"
    COMMUNAL_STORE_WALLS = "communal_store_walls"
    COMMUNAL_STORE_DOORS = "communal_store_doors"
    COMMUNAL_WARDEN_CALL_SYSTEM = "communal_warden_call_system"
    COMMUNAL_BMS = "communal_bms"
    COMMUNAL_BOOSTER_PUMP = "communal_booster_pump"
    COMMUNAL_DRY_RISER = "communal_dry_riser"
    COMMUNAL_WET_RISER = "communal_wet_riser"
    COMMUNAL_COLD_WATER_STORAGE = "communal_cold_water_storage"
    COMMUNAL_SPRINKLER = "communal_sprinkler"
    COMMUNAL_PLUG_SOCKETS = "communal_plug_sockets"
    COMMUNAL_CIRCULATION_SPACE = "communal_circulation_space"

    # ======================
    # FITNESS FOR HUMAN HABITATION
    # ======================
    FFHH_DAMP = "ffhh_damp"
    FFHH_HOT_AND_COLD_WATER = "ffhh_hold_and_cold_water"
    FFHH_DRAINAGE_LAVATORIES = "ffhh_drainage_lavatories"
    FFHH_NEGLECTED = "ffhh_neglected"
    FFHH_NATURAL_LIGHT = "ffhh_natural_light"
    FFHH_VENTILATION = "ffhh_ventilation"
    FFHH_FOOD_PREP_AND_WASHUP = "ffhh_food_prep_and_washup"
    FFHH_UNSAFE_LAYOUT = "ffhh_unsafe_layout"
    FFHH_UNSTABLE_BUILDING = "ffhh_unstable_building"

    # ==========================================================
    # HHSRS – ALL 29 HAZARDS
    # ==========================================================

    # TODO: In order to group HHSRS, should there be a single HHSRS element type, and each of the below is an AspectType?

    HHSRS_DAMP_AND_MOULD = "hhsrs_damp_and_mould"
    HHSRS_EXCESS_COLD = "hhsrs_excess_cold"
    HHSRS_EXCESS_HEAT = "hhsrs_excess_heat"
    HHSRS_ASBESTOS_AND_MMF = "hhsrs_asbestos_and_mmf"
    HHSRS_BIOCIDES = "hhsrs_biocides"
    HHSRS_CARBON_MONOXIDE = "hhsrs_carbon_monoxide"
    HHSRS_LEAD = "hhsrs_lead"
    HHSRS_RADIATION = "hhsrs_radiation"
    HHSRS_UNCOMBUSTED_FUEL_GAS = "hhsrs_uncombusted_fuel_gas"
    HHSRS_VOLATILE_ORGANIC_COMPOUNDS = "hhsrs_volatile_organic_compounds"
    HHSRS_CROWDING_AND_SPACE = "hhsrs_crowding_and_space"
    HHSRS_ENTRY_BY_INTRUDERS = "hhsrs_entry_by_intruders"
    HHSRS_LIGHTING = "hhsrs_lighting"
    HHSRS_NOISE = "hhsrs_noise"
    HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE = "hhsrs_domestic_hygiene_pests_refuse"
    HHSRS_FOOD_SAFETY = "hhsrs_food_safety"
    HHSRS_PERSONAL_HYGIENE_SANITATION = "hhsrs_personal_hygiene_sanitation"
    HHSRS_WATER_SUPPLY = "hhsrs_water_supply"
    HHSRS_FALLS_ASSOCIATED_WITH_BATHS = "hhsrs_falls_associated_with_baths"
    HHSRS_FALLS_ON_LEVEL_SURFACES = "hhsrs_falls_on_level_surfaces"
    HHSRS_FALLS_ON_STAIRS = "hhsrs_falls_on_stairs"
    HHSRS_FALLS_BETWEEN_LEVELS = "hhsrs_falls_between_levels"
    HHSRS_ELECTRICAL_HAZARDS = "hhsrs_electrical_hazards"
    HHSRS_FIRE = "hhsrs_fire"
    HHSRS_FLAMES_HOT_SURFACES = "hhsrs_flames_hot_surfaces"
    HHSRS_COLLISION_AND_ENTRAPMENT = "hhsrs_collision_and_entrapment"
    HHSRS_COLLISION_HAZARDS_LOW_HEADROOM = "hhsrs_collision_hazards_low_headroom"
    HHSRS_EXPLOSIONS = "hhsrs_explosions"
    HHSRS_ERGONOMICS = "hhsrs_ergonomics"
    HHSRS_STRUCTURAL_COLLAPSE = "hhsrs_structural_collapse"
    HHSRS_AMENITIES = "hhsrs_amenities"
