"""Humidifier adv parser."""

from __future__ import annotations

import logging
from datetime import timedelta

from ..const.evaporative_humidifier import (
    OVER_HUMIDIFY_PROTECTION_MODES,
    TARGET_HUMIDITY_MODES,
    HumidifierMode,
    HumidifierWaterLevel,
)

_LOGGER = logging.getLogger(__name__)

# mfr_data: 943cc68d3d2e
# data: 650000cd802b6300
# data: 650000cd802b6300
# data: 658000c9802b6300


# Low:  658000c5222b6300
# Med:  658000c5432b6300
# High: 658000c5642b6300
def process_wohumidifier(
    data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
    """Process WoHumi services data."""
    if data is None:
        return {
            "isOn": None,
            "level": None,
            "switchMode": True,
        }

    return {
        "isOn": bool(data[1]),
        "level": data[4],
        "switchMode": True,
    }


def process_evaporative_humidifier(
    data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
    """Process WoHumi services data."""
    if mfr_data is None:
        return {
            "isOn": None,
            "mode": None,
            "target_humidity": None,
            "child_lock": None,
            "over_humidify_protection": None,
            "tank_removed": None,
            "tilted_alert": None,
            "filter_missing": None,
            "humidity": None,
            "temperature": None,
            "filter_run_time": None,
            "filter_alert": None,
            "water_level": None,
        }

    is_on = bool(mfr_data[7] & 0b10000000)
    mode = HumidifierMode(mfr_data[7] & 0b00001111)
    filter_run_time = timedelta(hours=int.from_bytes(mfr_data[12:14], byteorder="big"))
    has_humidity = bool(mfr_data[9] & 0b10000000)
    has_temperature = bool(mfr_data[10] & 0b10000000)
    is_tank_removed = bool(mfr_data[8] & 0b00000100)
    return {
        "isOn": is_on,
        "mode": mode if is_on else None,
        "target_humidity": (mfr_data[16] & 0b01111111)
        if is_on and mode in TARGET_HUMIDITY_MODES
        else None,
        "child_lock": bool(mfr_data[8] & 0b00100000),
        "over_humidify_protection": bool(mfr_data[8] & 0b10000000)
        if is_on and mode in OVER_HUMIDIFY_PROTECTION_MODES
        else None,
        "tank_removed": is_tank_removed,
        "tilted_alert": bool(mfr_data[8] & 0b00000010),
        "filter_missing": bool(mfr_data[8] & 0b00000001),
        "humidity": (mfr_data[9] & 0b01111111) if has_humidity else None,
        "temperature": float(mfr_data[10] & 0b01111111) + float(mfr_data[11] >> 4) / 10
        if has_temperature
        else None,
        "filter_run_time": filter_run_time,
        "filter_alert": filter_run_time.days >= 10,
        "water_level": HumidifierWaterLevel(mfr_data[11] & 0b00000011)
        if not is_tank_removed
        else None,
    }