"""MySensors constants."""
from collections import defaultdict

ATTR_DEVICES = 'devices'

CONF_BAUD_RATE = 'baud_rate'
CONF_DEVICE = 'device'
CONF_GATEWAYS = 'gateways'
CONF_NODES = 'nodes'
CONF_PERSISTENCE = 'persistence'
CONF_PERSISTENCE_FILE = 'persistence_file'
CONF_RETAIN = 'retain'
CONF_TCP_PORT = 'tcp_port'
CONF_TOPIC_IN_PREFIX = 'topic_in_prefix'
CONF_TOPIC_OUT_PREFIX = 'topic_out_prefix'
CONF_VERSION = 'version'

DOMAIN = 'mysensors'
MYSENSORS_GATEWAY_READY = 'mysensors_gateway_ready_{}'
MYSENSORS_GATEWAYS = 'mysensors_gateways'
PLATFORM = 'platform'
SCHEMA = 'schema'
CHILD_CALLBACK = 'mysensors_child_callback_{}_{}_{}_{}'
NODE_CALLBACK = 'mysensors_node_callback_{}_{}'
TYPE = 'type'
UPDATE_DELAY = 0.1

BINARY_SENSOR_TYPES = {
    'S_DOOR': 'V_TRIPPED',
    'S_MOTION': 'V_TRIPPED',
    'S_SMOKE': 'V_TRIPPED',
    'S_SPRINKLER': 'V_TRIPPED',
    'S_WATER_LEAK': 'V_TRIPPED',
    'S_SOUND': 'V_TRIPPED',
    'S_VIBRATION': 'V_TRIPPED',
    'S_MOISTURE': 'V_TRIPPED',
}

CLIMATE_TYPES = {
    'S_HVAC': 'V_HVAC_FLOW_STATE',
}

COVER_TYPES = {
    'S_COVER': ['V_DIMMER', 'V_PERCENTAGE', 'V_LIGHT', 'V_STATUS'],
}

DEVICE_TRACKER_TYPES = {
    'S_GPS': 'V_POSITION',
}

LIGHT_TYPES = {
    'S_DIMMER': ['V_DIMMER', 'V_PERCENTAGE'],
    'S_RGB_LIGHT': 'V_RGB',
    'S_RGBW_LIGHT': 'V_RGBW',
}

NOTIFY_TYPES = {
    'S_INFO': 'V_TEXT',
}

SENSOR_TYPES = {
    'S_SOUND': 'V_LEVEL',
    'S_VIBRATION': 'V_LEVEL',
    'S_MOISTURE': 'V_LEVEL',
    'S_INFO': 'V_TEXT',
    'S_GPS': 'V_POSITION',
    'S_TEMP': 'V_TEMP',
    'S_HUM': 'V_HUM',
    'S_BARO': ['V_PRESSURE', 'V_FORECAST'],
    'S_WIND': ['V_WIND', 'V_GUST', 'V_DIRECTION'],
    'S_RAIN': ['V_RAIN', 'V_RAINRATE'],
    'S_UV': 'V_UV',
    'S_WEIGHT': ['V_WEIGHT', 'V_IMPEDANCE'],
    'S_POWER': ['V_WATT', 'V_KWH', 'V_VAR', 'V_VA', 'V_POWER_FACTOR'],
    'S_DISTANCE': 'V_DISTANCE',
    'S_LIGHT_LEVEL': ['V_LIGHT_LEVEL', 'V_LEVEL'],
    'S_IR': 'V_IR_RECEIVE',
    'S_WATER': ['V_FLOW', 'V_VOLUME'],
    'S_CUSTOM': ['V_VAR1', 'V_VAR2', 'V_VAR3', 'V_VAR4', 'V_VAR5', 'V_CUSTOM'],
    'S_SCENE_CONTROLLER': ['V_SCENE_ON', 'V_SCENE_OFF'],
    'S_COLOR_SENSOR': 'V_RGB',
    'S_MULTIMETER': ['V_VOLTAGE', 'V_CURRENT', 'V_IMPEDANCE'],
    'S_GAS': ['V_FLOW', 'V_VOLUME'],
    'S_WATER_QUALITY': ['V_TEMP', 'V_PH', 'V_ORP', 'V_EC'],
    'S_AIR_QUALITY': ['V_DUST_LEVEL', 'V_LEVEL'],
    'S_DUST': ['V_DUST_LEVEL', 'V_LEVEL'],
}

SWITCH_TYPES = {
    'S_LIGHT': 'V_LIGHT',
    'S_BINARY': 'V_STATUS',
    'S_DOOR': 'V_ARMED',
    'S_MOTION': 'V_ARMED',
    'S_SMOKE': 'V_ARMED',
    'S_SPRINKLER': 'V_STATUS',
    'S_WATER_LEAK': 'V_ARMED',
    'S_SOUND': 'V_ARMED',
    'S_VIBRATION': 'V_ARMED',
    'S_MOISTURE': 'V_ARMED',
    'S_IR': 'V_IR_SEND',
    'S_LOCK': 'V_LOCK_STATUS',
    'S_WATER_QUALITY': 'V_STATUS',
}


PLATFORM_TYPES = {
    'binary_sensor': BINARY_SENSOR_TYPES,
    'climate': CLIMATE_TYPES,
    'cover': COVER_TYPES,
    'device_tracker': DEVICE_TRACKER_TYPES,
    'light': LIGHT_TYPES,
    'notify': NOTIFY_TYPES,
    'sensor': SENSOR_TYPES,
    'switch': SWITCH_TYPES,
}

FLAT_PLATFORM_TYPES = {
    (platform, s_type_name): v_type_name
    for platform, platform_types in PLATFORM_TYPES.items()
    for s_type_name, v_type_name in platform_types.items()
}

TYPE_TO_PLATFORMS = defaultdict(list)
for platform, platform_types in PLATFORM_TYPES.items():
    for s_type_name in platform_types:
        TYPE_TO_PLATFORMS[s_type_name].append(platform)