"""Air Purifier adv parser."""

from __future__ import annotations

import struct

from ..const.air_purifier import AirPurifierMode, AirQualityLevel


def process_air_purifier(
    data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
    """Process air purifier services data."""
    if mfr_data is None or len(mfr_data) < 14:
        return {}
    device_data = mfr_data[6:]

    _seq_num = device_data[0]
    _isOn = bool(device_data[1] & 0b10000000)
    _mode = device_data[1] & 0b00000111
    _is_aqi_valid = bool(device_data[2] & 0b00000100)
    _child_lock = bool(device_data[2] & 0b00000010)
    _speed = device_data[3] & 0b01111111
    _aqi_level = (device_data[4] & 0b00000110) >> 1
    _aqi_level = AirQualityLevel(_aqi_level).name.lower()
    _work_time = struct.unpack(">H", device_data[5:7])[0]
    _err_code = device_data[7]

    return {
        "isOn": _isOn,
        "mode": get_air_purifier_mode(_mode, _speed),
        "isAqiValid": _is_aqi_valid,
        "child_lock": _child_lock,
        "speed": _speed,
        "aqi_level": _aqi_level,
        "filter element working time": _work_time,
        "err_code": _err_code,
        "sequence_number": _seq_num,
    }


def get_air_purifier_mode(mode: int, speed: int) -> str | None:
    if mode == 1:
        if 0 <= speed <= 33:
            return "level_1"
        if 34 <= speed <= 66:
            return "level_2"
        return "level_3"
    if 1 < mode <= 4:
        mode += 2
        return AirPurifierMode(mode).name.lower()
    return None
