"""Base Commands for SwitchBot API."""

from __future__ import annotations

from enum import Enum
from typing import TypeVar


class Commands(Enum):
    """Base command class."""

    @classmethod
    def is_supported(cls, device_type: str) -> bool:
        """Is this commands supported this device type."""
        return device_type in cls.get_supported_devices()

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return []


class CommonCommands(Commands):
    """Common commands."""

    ON = "turnOn"
    OFF = "turnOff"
    TOGGLE = "toggle"
    PRESS = "press"

    # Considering the wide range of CommonCommands, they are not inherited here.
    @classmethod
    def is_supported(cls, device_type: str) -> bool:
        """Is this commands supported this device type."""
        error_msg = "CommonCommands not implement this method"
        raise NotImplementedError(error_msg)

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        error_msg = "CommonCommands not implement this method"
        raise NotImplementedError(error_msg)


class BotCommands(Commands):
    """Bot commands."""

    PRESS = "press"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Bot"]


class OthersCommands(Commands):
    """Others commands."""

    CUSTOMIZE = "customize"  # Command {user-defined button name}


class CurtainCommands(Commands):
    """Curtain & Curtain3 commands."""

    SET_POSITION = "setPosition"  # parameter(str): index0,mode0,position0  e.g. 0,ff,80
    PAUSE = "pause"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Curtain", "Curtain 3"]


class LockCommands(Commands):
    """Lock commands."""

    LOCK = "lock"
    UNLOCK = "unlock"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Smart Lock", "Smart Lock Lite", "Smart Lock Pro", "Smart Lock Ultra"]


class LockV2Commands(Commands):
    """Lock commands."""

    LOCK = "lock"
    UNLOCK = "unlock"
    DEADBOLT = "deadbolt"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Smart Lock", "Smart Lock Pro", "Smart Lock Ultra", "Smart Lock Vision"]


class LockV3Commands(Commands):
    """Lock commands."""

    LOCK = "lock"
    UNLOCK = "unlock"
    DEADBOLT = "deadbolt"
    NIGHT_LATCH_UNLOCK = "nightLatchUnlock"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Smart Lock Vision Pro"]


class HumidifierCommands(Commands):
    """Humidifier commands."""

    # parameter: auto, set to Auto Mode
    # 101, set atomization efficiency to 34%
    # 102, set atomization efficiency to 67%
    # 103, set atomization efficiency to 100%
    SET_MODE = "setMode"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Humidifier"]


class HumidifierV2Commands(Commands):
    """Humidifier 2 commands."""

    SET_MODE = "setMode"
    SET_CHILD_LOCK = "setChildLock"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Humidifier 2"]


class AirPurifierCommands(Commands):
    """Purifier commands."""

    # Supported Device list:
    # Air Purifier VOC
    # Air Purifier Table VOC
    # Air Purifier PM2.5
    # Air Purifier Table PM2.5

    SET_MODE = "setMode"
    SET_CHILD_LOCK = "setChildLock"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return [
            "Air Purifier VOC",
            "Air Purifier Table VOC",
            "Air Purifier PM2.5",
            "Air Purifier Table PM2.5",
        ]


class AirConditionerCommands(Commands):
    """Air conditioner commands."""

    SET_ALL = "setAll"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Air Conditioner"]


class SwitchCommands(Commands):
    """Switch commands."""

    # Supported Device list:
    # Relay Switch 1
    # Relay Switch 1PM
    SET_MODE = "setMode"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Relay Switch 1", "Relay Switch 1PM"]


class Switch2PMCommands(Commands):
    """Switch commands."""

    # Supported Device list:
    # Relay Switch 2PM
    SET_MODE = "setMode"
    SET_POSITION = "setPosition"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Relay Switch 2PM"]


class RGBWLightCommands(Commands):
    """RGBWLight commands."""

    # Supported Device list:
    # Strip Light
    # RGBIC Neon Rope Light
    # RGBIC Neon Wire Rope Light
    SET_BRIGHTNESS = "setBrightness"
    SET_COLOR = "setColor"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Strip Light", "RGBIC Neon Rope Light", "RGBIC Neon Wire Rope Light"]


class RGBWWLightCommands(Commands):
    """RGBWwLight commands."""

    # Supported Device list:
    # Floor Lamp
    # Strip Light 3
    # Color Bulb
    # RGBICWW Floor Lamp
    # RGBICWW Strip Light
    SET_BRIGHTNESS = "setBrightness"
    SET_COLOR = "setColor"
    SET_COLOR_TEMPERATURE = "setColorTemperature"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return [
            "Strip Light 3",
            "Floor Lamp",
            "Color Bulb",
            "RGBICWW Floor Lamp",
            "RGBICWW Strip Light",
        ]


class CeilingLightCommands(Commands):
    """Ceiling light commands."""

    # 1-100
    SET_BRIGHTNESS = "setBrightness"
    # 2700-6500
    SET_COLOR_TEMPERATURE = "setColorTemperature"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Ceiling Light", "Ceiling Light Pro"]


class ArtFrameCommands(Commands):
    """AI Art Frame commands."""

    PREVIOUS = "previous"
    NEXT = "next"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["AI Art Frame"]


class DoorBellCommands(Commands):
    """Door Bell commands."""

    ENABLE = "enableMotionDetection"
    DISABLE = "disableMotionDetection"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Video Doorbell"]


class VacuumCommands(Commands):
    """Vacuum commands."""

    START = "start"
    STOP = "stop"
    DOCK = "dock"
    POW_LEVEL = "PowLevel"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return [
            "K10+",
            "K10+ Pro",
            "Robot Vacuum Cleaner S1",
            "Robot Vacuum Cleaner S1 Plus",
        ]


class VacuumCleanerV2Commands(Commands):
    """VacuumCleanerV2 commands."""

    # Supported Device list:
    # K20+ Pro
    # Robot Vacuum Cleaner K10+ Pro Combo
    START_CLEAN = "startClean"
    PAUSE = "pause"
    DOCK = "dock"
    SET_VOLUME = "setVolume"
    CHANGE_PARAM = "changeParam"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["K20+ Pro", "Robot Vacuum Cleaner K10+ Pro Combo"]


class VacuumCleanerV3Commands(Commands):
    """VacuumCleanerV3 commands."""

    # Supported Device list:
    # Floor Cleaning Robot S10
    # S20
    START_CLEAN = "startClean"
    PAUSE = "pause"
    DOCK = "dock"
    SET_VOLUME = "setVolume"
    CHANGE_PARAM = "changeParam"
    ADD_WATER_FOR_HUMI = "addWaterForHumi"
    SELF_CLEAN = "selfClean"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Robot Vacuum Cleaner S10", "S20"]


class BlindTiltCommands(Commands):
    """Blind Tilt commands."""

    SET_POSITION = "setPosition"
    FULLY_OPEN = "fullyOpen"
    CLOSE_UP = "closeUp"
    CLOSE_DOWN = "closeDown"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Blind Tilt"]


class RollerShadeCommands(Commands):
    """Roller Shade commands."""

    SET_POSITION = "setPosition"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Roller Shade"]


class BatteryCirculatorFanCommands(Commands):
    """Command types for [Battery Circulator Fan] API."""

    SET_WIND_SPEED = "setWindSpeed"
    SET_WIND_MODE = "setWindMode"
    SET_NIGHT_LIGHT_MODE = "setNightLightMode"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Circulator Fan", "Battery Circulator Fan"]


class TVCommands(Commands):
    """TV commands."""

    SET_CHANNEL = "SetChannel"
    VOLUME_ADD = "volumeAdd"
    VOLUME_SUB = "volumeSub"
    CHANNEL_ADD = "channelAdd"
    CHANNEL_SUB = "channelSub"


class DVDCommands(Commands):
    """DVD commands."""

    SET_MUTE = "setMute"
    FAST_FORWARD = "FastForward"
    REWIND = "Rewind"
    NEXT = "Next"
    PREVIOUS = "Previous"
    PAUSE = "Pause"
    PLAY = "Play"
    STOP = "Stop"


class SpeakerCommands(Commands):
    """Speaker commands."""

    VOLUME_ADD = "volumeAdd"
    VOLUME_SUB = "volumeSub"


class FanCommands(Commands):
    """Fan commands."""

    SWING = "swing"
    TIMER = "timer"
    LOW_SPEED = "lowSpeed"
    MIDDLE_SPEED = "middleSpeed"
    HIGH_SPEED = "highSpeed"


class LightCommands(Commands):
    """Light commands."""

    BRIGHTNESS_UP = "brightnessUp"
    BRIGHTNESS_DOWN = "brightnessDown"


class SmartRadiatorThermostatCommands(Commands):
    """Smart Radiator Thermostat commands."""

    SET_MODE = "setMode"
    SET_MANUAL_MODE_TEMPERATURE = "setManualModeTemperature"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Smart Radiator Thermostat"]


class KeyPadCommands(Commands):
    """Keypad commands."""

    DELETE_KEY = "deleteKey"
    CREATE_KEY = "createKey"

    @classmethod
    def get_supported_devices(cls) -> list[str]:
        """Get supported devices."""
        return ["Keypad", "Keypad Touch", "Keypad Vision", "Keypad Vision pro"]


T = TypeVar("T", bound=CommonCommands)
