"""Z-Wave discovery schemas."""
from . import const

DEFAULT_VALUES_SCHEMA = {
    "power": {
        const.DISC_SCHEMAS: [
            {
                const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL],
                const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_POWER],
            },
            {
                const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_METER],
                const.DISC_INDEX: [const.INDEX_METER_POWER],
            },
        ],
        const.DISC_OPTIONAL: True,
    }
}

DISCOVERY_SCHEMAS = [
    {
        const.DISC_COMPONENT: "binary_sensor",
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_ENTRY_CONTROL,
            const.GENERIC_TYPE_SENSOR_ALARM,
            const.GENERIC_TYPE_SENSOR_BINARY,
            const.GENERIC_TYPE_SWITCH_BINARY,
            const.GENERIC_TYPE_METER,
            const.GENERIC_TYPE_SENSOR_MULTILEVEL,
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_SENSOR_NOTIFICATION,
            const.GENERIC_TYPE_THERMOSTAT,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_BINARY],
                    const.DISC_TYPE: const.TYPE_BOOL,
                    const.DISC_GENRE: const.GENRE_USER,
                },
                "off_delay": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION],
                    const.DISC_INDEX: [9],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "climate",  # thermostat without COMMAND_CLASS_THERMOSTAT_MODE
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_THERMOSTAT,
            const.GENERIC_TYPE_SENSOR_MULTILEVEL,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_THERMOSTAT_HEATING,
            const.SPECIFIC_TYPE_SETPOINT_THERMOSTAT,
            const.SPECIFIC_TYPE_NOT_USED,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_MODE]
                },
                "setpoint_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [1],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [2],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_furnace": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [7],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_dry_air": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [8],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_moist_air": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [9],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_auto_changeover": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [10],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_eco_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [11],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_eco_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [12],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_away_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [13],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_away_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [14],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_full_power": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [15],
                    const.DISC_OPTIONAL: True,
                },
                "temperature": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_TEMPERATURE],
                    const.DISC_OPTIONAL: True,
                },
                "fan_mode": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_FAN_MODE],
                    const.DISC_OPTIONAL: True,
                },
                "operating_state": {
                    const.DISC_COMMAND_CLASS: [
                        const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE
                    ],
                    const.DISC_OPTIONAL: True,
                },
                "fan_action": {
                    const.DISC_COMMAND_CLASS: [
                        const.COMMAND_CLASS_THERMOSTAT_FAN_ACTION
                    ],
                    const.DISC_OPTIONAL: True,
                },
                "mode": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_MODE],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "climate",  # thermostat with COMMAND_CLASS_THERMOSTAT_MODE
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_THERMOSTAT,
            const.GENERIC_TYPE_SENSOR_MULTILEVEL,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_THERMOSTAT_GENERAL,
            const.SPECIFIC_TYPE_THERMOSTAT_GENERAL_V2,
            const.SPECIFIC_TYPE_SETBACK_THERMOSTAT,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_MODE]
                },
                "setpoint_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [1],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [2],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_furnace": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [7],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_dry_air": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [8],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_moist_air": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [9],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_auto_changeover": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [10],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_eco_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [11],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_eco_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [12],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_away_heating": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [13],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_away_cooling": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [14],
                    const.DISC_OPTIONAL: True,
                },
                "setpoint_full_power": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_SETPOINT],
                    const.DISC_INDEX: [15],
                    const.DISC_OPTIONAL: True,
                },
                "temperature": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_TEMPERATURE],
                    const.DISC_OPTIONAL: True,
                },
                "fan_mode": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_FAN_MODE],
                    const.DISC_OPTIONAL: True,
                },
                "operating_state": {
                    const.DISC_COMMAND_CLASS: [
                        const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE
                    ],
                    const.DISC_OPTIONAL: True,
                },
                "fan_action": {
                    const.DISC_COMMAND_CLASS: [
                        const.COMMAND_CLASS_THERMOSTAT_FAN_ACTION
                    ],
                    const.DISC_OPTIONAL: True,
                },
                "zxt_120_swing_mode": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION],
                    const.DISC_INDEX: [33],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "cover",  # Rollershutter
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_ENTRY_CONTROL,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION,
            const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON,
            const.SPECIFIC_TYPE_SECURE_DOOR,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_GENRE: const.GENRE_USER,
                },
                "open": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_BRIGHT],
                    const.DISC_OPTIONAL: True,
                },
                "close": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DIM],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "cover",  # Garage Door Switch
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_ENTRY_CONTROL,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION,
            const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON,
            const.SPECIFIC_TYPE_SECURE_DOOR,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_BINARY],
                    const.DISC_GENRE: const.GENRE_USER,
                }
            },
        ),
    },
    {
        const.DISC_COMPONENT: "cover",  # Garage Door Barrier
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_ENTRY_CONTROL,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL,
            const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION,
            const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON,
            const.SPECIFIC_TYPE_SECURE_DOOR,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_BARRIER_OPERATOR],
                    const.DISC_INDEX: [const.INDEX_BARRIER_OPERATOR_LABEL],
                }
            },
        ),
    },
    {
        const.DISC_COMPONENT: "fan",
        const.DISC_GENERIC_DEVICE_CLASS: [const.GENERIC_TYPE_SWITCH_MULTILEVEL],
        const.DISC_SPECIFIC_DEVICE_CLASS: [const.SPECIFIC_TYPE_FAN_SWITCH],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_LEVEL],
                    const.DISC_TYPE: const.TYPE_BYTE,
                }
            },
        ),
    },
    {
        const.DISC_COMPONENT: "light",
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_SWITCH_REMOTE,
        ],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_POWER_SWITCH_MULTILEVEL,
            const.SPECIFIC_TYPE_SCENE_SWITCH_MULTILEVEL,
            const.SPECIFIC_TYPE_NOT_USED,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_LEVEL],
                    const.DISC_TYPE: const.TYPE_BYTE,
                },
                "dimming_duration": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL],
                    const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DURATION],
                    const.DISC_OPTIONAL: True,
                },
                "color": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR],
                    const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_COLOR],
                    const.DISC_OPTIONAL: True,
                },
                "color_channels": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR],
                    const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_CHANNELS],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "lock",
        const.DISC_GENERIC_DEVICE_CLASS: [const.GENERIC_TYPE_ENTRY_CONTROL],
        const.DISC_SPECIFIC_DEVICE_CLASS: [
            const.SPECIFIC_TYPE_DOOR_LOCK,
            const.SPECIFIC_TYPE_ADVANCED_DOOR_LOCK,
            const.SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK,
            const.SPECIFIC_TYPE_SECURE_LOCKBOX,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_DOOR_LOCK],
                    const.DISC_INDEX: [const.INDEX_DOOR_LOCK_LOCK],
                },
                "access_control": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
                    const.DISC_INDEX: [const.INDEX_ALARM_ACCESS_CONTROL],
                    const.DISC_OPTIONAL: True,
                },
                "alarm_type": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
                    const.DISC_INDEX: [const.INDEX_ALARM_TYPE],
                    const.DISC_OPTIONAL: True,
                },
                "alarm_level": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM],
                    const.DISC_INDEX: [const.INDEX_ALARM_LEVEL],
                    const.DISC_OPTIONAL: True,
                },
                "v2btze_advanced": {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION],
                    const.DISC_INDEX: [12],
                    const.DISC_OPTIONAL: True,
                },
            },
        ),
    },
    {
        const.DISC_COMPONENT: "sensor",
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [
                        const.COMMAND_CLASS_SENSOR_MULTILEVEL,
                        const.COMMAND_CLASS_METER,
                        const.COMMAND_CLASS_ALARM,
                        const.COMMAND_CLASS_SENSOR_ALARM,
                        const.COMMAND_CLASS_INDICATOR,
                        const.COMMAND_CLASS_BATTERY,
                    ],
                    const.DISC_GENRE: const.GENRE_USER,
                }
            },
        ),
    },
    {
        const.DISC_COMPONENT: "switch",
        const.DISC_GENERIC_DEVICE_CLASS: [
            const.GENERIC_TYPE_METER,
            const.GENERIC_TYPE_SENSOR_ALARM,
            const.GENERIC_TYPE_SENSOR_BINARY,
            const.GENERIC_TYPE_SWITCH_BINARY,
            const.GENERIC_TYPE_ENTRY_CONTROL,
            const.GENERIC_TYPE_SENSOR_MULTILEVEL,
            const.GENERIC_TYPE_SWITCH_MULTILEVEL,
            const.GENERIC_TYPE_SENSOR_NOTIFICATION,
            const.GENERIC_TYPE_GENERIC_CONTROLLER,
            const.GENERIC_TYPE_SWITCH_REMOTE,
            const.GENERIC_TYPE_REPEATER_SLAVE,
            const.GENERIC_TYPE_THERMOSTAT,
            const.GENERIC_TYPE_WALL_CONTROLLER,
        ],
        const.DISC_VALUES: dict(
            DEFAULT_VALUES_SCHEMA,
            **{
                const.DISC_PRIMARY: {
                    const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_BINARY],
                    const.DISC_TYPE: const.TYPE_BOOL,
                    const.DISC_GENRE: const.GENRE_USER,
                }
            },
        ),
    },
]
