"""Constants for the Awair component."""

from dataclasses import dataclass
from datetime import timedelta
import logging

from python_awair.devices import AwairDevice

from homeassistant.const import (
    ATTR_DEVICE_CLASS,
    CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
    CONCENTRATION_PARTS_PER_BILLION,
    CONCENTRATION_PARTS_PER_MILLION,
    DEVICE_CLASS_HUMIDITY,
    DEVICE_CLASS_ILLUMINANCE,
    DEVICE_CLASS_TEMPERATURE,
    TEMP_CELSIUS,
    UNIT_PERCENTAGE,
)

API_CO2 = "carbon_dioxide"
API_DUST = "dust"
API_HUMID = "humidity"
API_LUX = "illuminance"
API_PM10 = "particulate_matter_10"
API_PM25 = "particulate_matter_2_5"
API_SCORE = "score"
API_SPL_A = "sound_pressure_level"
API_TEMP = "temperature"
API_TIMEOUT = 20
API_VOC = "volatile_organic_compounds"

ATTRIBUTION = "Awair air quality sensor"

ATTR_ICON = "icon"
ATTR_LABEL = "label"
ATTR_UNIT = "unit"
ATTR_UNIQUE_ID = "unique_id"

DOMAIN = "awair"

DUST_ALIASES = [API_PM25, API_PM10]

LOGGER = logging.getLogger(__package__)

UPDATE_INTERVAL = timedelta(minutes=5)

SENSOR_TYPES = {
    API_SCORE: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:blur",
        ATTR_UNIT: UNIT_PERCENTAGE,
        ATTR_LABEL: "Awair score",
        ATTR_UNIQUE_ID: "score",  # matches legacy format
    },
    API_HUMID: {
        ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
        ATTR_ICON: None,
        ATTR_UNIT: UNIT_PERCENTAGE,
        ATTR_LABEL: "Humidity",
        ATTR_UNIQUE_ID: "HUMID",  # matches legacy format
    },
    API_LUX: {
        ATTR_DEVICE_CLASS: DEVICE_CLASS_ILLUMINANCE,
        ATTR_ICON: None,
        ATTR_UNIT: "lx",
        ATTR_LABEL: "Illuminance",
        ATTR_UNIQUE_ID: "illuminance",
    },
    API_SPL_A: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:ear-hearing",
        ATTR_UNIT: "dBa",
        ATTR_LABEL: "Sound level",
        ATTR_UNIQUE_ID: "sound_level",
    },
    API_VOC: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:cloud",
        ATTR_UNIT: CONCENTRATION_PARTS_PER_BILLION,
        ATTR_LABEL: "Volatile organic compounds",
        ATTR_UNIQUE_ID: "VOC",  # matches legacy format
    },
    API_TEMP: {
        ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
        ATTR_ICON: None,
        ATTR_UNIT: TEMP_CELSIUS,
        ATTR_LABEL: "Temperature",
        ATTR_UNIQUE_ID: "TEMP",  # matches legacy format
    },
    API_PM25: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:blur",
        ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
        ATTR_LABEL: "PM2.5",
        ATTR_UNIQUE_ID: "PM25",  # matches legacy format
    },
    API_PM10: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:blur",
        ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
        ATTR_LABEL: "PM10",
        ATTR_UNIQUE_ID: "PM10",  # matches legacy format
    },
    API_CO2: {
        ATTR_DEVICE_CLASS: None,
        ATTR_ICON: "mdi:cloud",
        ATTR_UNIT: CONCENTRATION_PARTS_PER_MILLION,
        ATTR_LABEL: "Carbon dioxide",
        ATTR_UNIQUE_ID: "CO2",  # matches legacy format
    },
}


@dataclass
class AwairResult:
    """Wrapper class to hold an awair device and set of air data."""

    device: AwairDevice
    air_data: dict
